在MVC中使用两个模型时,View返回null值

问题描述 投票:0回答:1

我有一个简单的MVC程序,早些时候我使用的是一个模型,代码运行正常。这是代码。

视图

@model Microsoft.Azure.ActiveDirectory.GraphClient.User
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create User</title>
</head>
<body>
<h2>Create User</h2><br />

 @using (Html.BeginForm("Create",
                           "CreateUsers",
                           new { id = Model != null ? Model.ObjectId : "" },
                           FormMethod.Post,
                           new { enctype = "multipart/form-data" })
                   )
 {

    <fieldset>
        <legend>User</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.UserPrincipalName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.UserPrincipalName)
            @Html.ValidationMessageFor(model => model.UserPrincipalName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.AccountEnabled)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AccountEnabled)
            @Html.ValidationMessageFor(model => model.AccountEnabled)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.PasswordProfile.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.PasswordProfile.Password)
            @Html.ValidationMessageFor(model => model.PasswordProfile.Password)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.MailNickname)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.MailNickname)
            @Html.ValidationMessageFor(model => model.MailNickname)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.DisplayName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.DisplayName)
            @Html.ValidationMessageFor(model => model.DisplayName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.GivenName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.GivenName)
            @Html.ValidationMessageFor(model => model.GivenName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Surname)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Surname)
            @Html.ValidationMessageFor(model => model.Surname)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.JobTitle)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.JobTitle)
            @Html.ValidationMessageFor(model => model.JobTitle)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Department)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Department)
            @Html.ValidationMessageFor(model => model.Department)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
</body>
</html>
 @if (ViewBag.ErrorMessage == "AuthorizationRequired")
 {
    <p>You have to sign-in. Click @Html.ActionLink("here", "Create", "Users", new { reauth = true }, null) to sign-in.</p>
}

调节器

 public async Task<ActionResult> Create(string blobDetails)
    {
        #region POPULATE USER DETAIL IN CREATEUSER FIELDS

        List<string> userDetails = blobDetails.Split(',').ToList();

        User user = new User();
        user.UserPrincipalName = userDetails[2] + "@xxx.com";
        user.GivenName = userDetails[0];
        user.Surname = userDetails[1];
        user.DisplayName = userDetails[0] + " " + userDetails[1];

        return View(Tuple.Create(user);

        #endregion
    }

     [HttpPost]
    public async Task<ActionResult> Create([Bind(Include ="UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department")] User user)
    {
        ActiveDirectoryClient client = null;
        client = AuthenticationHelper.GetActiveDirectoryClient();

        string name = user.GivenName;
        string username = user.UserPrincipalName;

        return RedirectToAction("Index");
    }

这很好用,我从视图中获取user.GivenName和user.UserPrincipalName的值,然后将其存储到字符串中。现在我正在做的是我将另外一个模型纳入其中并尝试从视图中获取其值,所以我做了类似这样的事情:

模型

public class CreateUsers
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public string PIDetails { get; set; }
    public string BlobDetails { get; set; }
    public string UserEmail { get; set; }
}

视图

@using WebAppGraphAPI.Models
@model Tuple<Microsoft.Azure.ActiveDirectory.GraphClient.User, CreateUsers>

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Create User</title>
</head>
<body>
<h2>Create User</h2><br />

@using (Html.BeginForm("Create",
                        "CreateUsers",
                        new { id = Model != null ? Model.Item1.ObjectId : "" 
 },
                        FormMethod.Post,
                        new { enctype = "multipart/form-data" })
                )
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>User</legend>
        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.UserPrincipalName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.UserPrincipalName)
            @Html.ValidationMessageFor(tuple => tuple.Item1.UserPrincipalName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.AccountEnabled)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.AccountEnabled)
            @Html.ValidationMessageFor(tuple => tuple.Item1.AccountEnabled)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.PasswordProfile.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.PasswordProfile.Password)
            @Html.ValidationMessageFor(tuple => tuple.Item1.PasswordProfile.Password)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.MailNickname)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.MailNickname)
            @Html.ValidationMessageFor(tuple => tuple.Item1.MailNickname)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.DisplayName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.DisplayName)
            @Html.ValidationMessageFor(tuple => tuple.Item1.DisplayName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.GivenName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.GivenName)
            @Html.ValidationMessageFor(tuple => tuple.Item1.GivenName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.Surname)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.Surname)
            @Html.ValidationMessageFor(tuple => tuple.Item1.Surname)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.JobTitle)
        </div>
        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.JobTitle)
            @Html.ValidationMessageFor(tuple => tuple.Item1.JobTitle)
        </div>

        <div class="editor-label">
            @Html.LabelFor(tuple => tuple.Item1.Department)
        </div>

        <div class="editor-field">
            @Html.EditorFor(tuple => tuple.Item1.Department)
            @Html.ValidationMessageFor(tuple => tuple.Item1.Department)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
<div class="editor-label">
    @*@Html.LabelFor(tuple => tuple.Item2.UserEmail)*@
    @Html.EditorFor(tuple => tuple.Item2.UserEmail)
</div>
</body>
</html>
@if (ViewBag.ErrorMessage == "AuthorizationRequired")
{
<p>You have to sign-in. Click @Html.ActionLink("here", "Create", "Users", new { reauth = true }, null) to sign-in.</p>
}

调节器

public async Task<ActionResult> Create(string blobDetails)
    {
        #region POPULATE USER DETAIL IN CREATEUSER FIELDS

        List<string> userDetails = blobDetails.Split(',').ToList();

        User user = new User();
        user.UserPrincipalName = userDetails[2] + "@gwuadmeaoutlook.onmicrosoft.com";
        user.GivenName = userDetails[0];
        user.Surname = userDetails[1];
        user.DisplayName = userDetails[0] + " " + userDetails[1];

        CreateUsers userInfo = new CreateUsers();
        userInfo.UserEmail = userDetails[4];
        return View(Tuple.Create(user,userInfo));
    }

   [HttpPost]
    public async Task<ActionResult> Create([Bind(Include ="UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department")] User user,[Bind(Include ="UserEmail")] CreateUsers userInfo)
    {
        ActiveDirectoryClient client = null;
        client = AuthenticationHelper.GetActiveDirectoryClient();

        string name = user.GivenName;
        string username = user.UserPrincipalName;
        string Email = userInfo.UserEmail

        return RedirectToAction("Index");

   }

当我这样做时,我没有从我的控制器字符串中的View获取值,它显示为null。你能告诉我怎样才能做到这一点。

asp.net-mvc azure
1个回答
0
投票

您可以使用包含您尝试发送给客户端的所有属性的对象。我们通常会为此特定用途创建DTO。在你的情况下,你有:

CreateDto

public class CreateDto
{
    public Microsoft.Azure.ActiveDirectory.GraphClient.User User { get; set; }
    public CreateUsers UserInfo { get; set; }
}

那么你的控制器将更新为:

public async Task<ActionResult> Create(string blobDetails)
{
    #region POPULATE USER DETAIL IN CREATEUSER FIELDS

    List<string> userDetails = blobDetails.Split(',').ToList();

    User user = new User();
    user.UserPrincipalName = userDetails[2] + "@gwuadmeaoutlook.onmicrosoft.com";
    user.GivenName = userDetails[0];
    user.Surname = userDetails[1];
    user.DisplayName = userDetails[0] + " " + userDetails[1];

    CreateUsers userInfo = new CreateUsers();
    userInfo.UserEmail = userDetails[4];

    var dto = new CreateDto() {
        User = user,
        UserInfo = userInfo
    }
    return View(dto);
}

[HttpPost]
public async Task<ActionResult> Create([Bind(Include ="UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department")] User user,[Bind(Include ="UserEmail")] CreateUsers userInfo)
{
    ActiveDirectoryClient client = null;
    client = AuthenticationHelper.GetActiveDirectoryClient();

    string name = user.GivenName;
    string username = user.UserPrincipalName;
    string Email = userInfo.UserEmail

    return RedirectToAction("Index");

}

你的观点将包括:

@using WebAppGraphAPI.Models
@model CreateDto

稍后您可以使用Model.user和Model.userInfo引用该信息。

我知道这并不能解释为什么元组不起作用。我认为@ darin-dimitrov最好在ado.net mvc3 tuple using in model and single views解释

© www.soinside.com 2019 - 2024. All rights reserved.