ViewModel 实例在创建时为 null
ViewModel instance is null on creating
我创建了这个视图模型class:
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 从用户 class 从活动目录更改为:
@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 始终为 Null,我无法获取在表单中键入的值。
我想可能有问题
[Bind(
Include =
但我不知道它是什么或语法
首先我不知道什么是最糟糕的,魔法字符串沿着代码传播,丑陋的架构或者你基本上将所有 mvc 版本标签添加到问题而不是你正在处理的版本.
该绑定是模型绑定器。
根据Model Binder的定义
当执行 "Create" 时,MVC 模型绑定器将使用请求参数来填充用户参数的属性,您应该知道。但是,Bind 特性告诉模型绑定器只填充具有指定名称的属性。
我击败 "Usuario" 总是空的,因为你没有在这个丑陋而巨大的魔法字符串中传递 属性
[Bind(Include = "UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department"
我创建了这个视图模型class:
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 从用户 class 从活动目录更改为:
@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 始终为 Null,我无法获取在表单中键入的值。
我想可能有问题
[Bind(
Include =
但我不知道它是什么或语法
首先我不知道什么是最糟糕的,魔法字符串沿着代码传播,丑陋的架构或者你基本上将所有 mvc 版本标签添加到问题而不是你正在处理的版本.
该绑定是模型绑定器。
根据Model Binder的定义 当执行 "Create" 时,MVC 模型绑定器将使用请求参数来填充用户参数的属性,您应该知道。但是,Bind 特性告诉模型绑定器只填充具有指定名称的属性。
我击败 "Usuario" 总是空的,因为你没有在这个丑陋而巨大的魔法字符串中传递 属性
[Bind(Include = "UserPrincipalName,AccountEnabled,PasswordProfile,MailNickname,DisplayName,GivenName,Surname,JobTitle,Department"