视图模型实例创建空(ViewModel instance is null on creating)

2019-10-24 11:30发布

我创造了这个视图模型类:

using System.Collections.Generic;
using Microsoft.Azure.ActiveDirectory.GraphClient;

namespace xx.Models.GlobalAdmin.Models
{
    public class UserViewModel
    {
        public  User Usuario { get; set; }
        public List<string> SelectedCompanies { get; set; }
    }
}

我改变了我的Create.cshtml从活动目录到这个User类:

@model CapatechSaasApp.Models.GlobalAdmin.Models.UserViewModel

所有这样的控件:

<div class="form-group">
    @Html.Label("Usuario", new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        <div class="input-group">
            @Html.EditorFor(model => model.Usuario.UserPrincipalName)
            <span class="input-group-addon" id="basic-addon2">@SettingsHelper.Domain.ToString()</span>
            @Html.Validatiomodel => model.Usuario.UserPrincipalName)
        </div>
    </div>
</div>

我也改变了创建行动,以这样的:

public async Task<ActionResult> Create(
    [Bind(Include = "UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department"
                )] CapatechSaasApp.Models.GlobalAdmin.Models.UserViewModel user, FormCollection formCollection)
        {
            ActiveDirectoryClient client;
            try
            {
                client = AuthenticationHelper.GetActiveDirectoryClient();
            }
            catch (Exception)
            {
                if (Request.QueryString["reauth"] == "True")
                {
                    //
                    // Send an OpenID Connect sign-in request to get a new set of tokens.
                    // If the user still has a valid session with Azure AD, they will not be prompted for their credentials.
                    // The OpenID Connect middleware will return to this controller after the sign-in response has been handled.
                    //
                    HttpContext.GetOwinContext()
                        .Authentication.Challenge(OpenIdConnectAuthenticationDefaults.AuthenticationType);
                }

                //
                // The user needs to re-authorize.  Show them a message to that effect.
                //
                ViewBag.ErrorMessage = "AuthorizationRequired";
                return View();
            }

            try
            {
                var usuario = user.Usuario.UserPrincipalName;
                user.Usuario.UserPrincipalName = usuario+SettingsHelper.Domain;
                user.Usuario.MailNickname = usuario;
                user.Usuario.AccountEnabled = true;
                await client.Users.AddUserAsync(user.Usuario);

                //Setting extended property lookup name
                var extPropLookupName = $"extension_{SettingsHelper.ClientId.Replace("-", "")}_{"Compania"}";

                //TO BE FINISHED
                user.Usuario.SetExtendedProperty(extPropLookupName, formCollection["Empresa"]);
                await user.Usuario.UpdateAsync();
                //Task.WaitAll();

                // Save the extended property value to Azure AD.
                user.Usuario.GetContext().SaveChanges();
                return RedirectToAction("Index");
            }
            catch (Exception exception)
            {
                ModelState.AddModelError("", exception.Message);
                return View();
            }
        }

然而user.Usuario总是空,我不能让输入表单上的值。

我猜有可能是什么问题

[Bind(
                    Include =

但我不知道会不会是或语法

Answer 1:

首先,我不知道什么是最糟糕的,魔术绳沿着码流传,丑陋的建筑或事实,你基本上添加的所有MVC版本标签的问题,而不是你正在使用的版本。

结合是Model粘合剂。

通过模型绑定的定义在“创建”执行MVC模型绑定将使用请求参数填充用户参数的属性,因为你应该知道。 但是,绑定属性告诉模型绑定只填充指定的名称属性。

我拍“Usuario”总是空,因为你不及格的财产在这个丑陋和魔幻巨串

[Bind(Include = "UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department"


文章来源: ViewModel instance is null on creating