我正在尝试使用视图模型将一些数据从视图传递到控制器。
在视野中,我有类似的东西:
@model LoginRegisterViewModel
<input type="text" name="Email" id="Email" placeholder="Email">
<input type="password" class="form-control" name="Password" id="Password" placeholder="Password">
查看模型:
public class LoginModel
{
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember Me")]
public bool RememberMe { get; set; }
public string ReturnUrl { get; set; }
}
public class RegisterModel
{
public string Username { get; set; }
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[DataType(DataType.Password)]
public string Password { get; set; }
public string ReturnUrl { get; set; }
}
public class ResetModel
{
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
public string ReturnUrl { get; set; }
}
public class LoginRegisterViewModel
{
public LoginModel Login { get; set; }
public RegisterModel Register { get; set; }
public ResetModel Reset { get; set; }
}
在控制器中:
public async Task<IActionResult> Login(LoginRegisterViewModel model, string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var userOrEmail = model.Login.Email;
SignInResult result;
if (userOrEmail.IndexOf('@') > 0)
result = await _signInManager.PasswordEmailSignInAsync(userOrEmail, model.Login.Password, model.Login.RememberMe, false);
else
result = await _signInManager.PasswordSignInAsync(userOrEmail, model.Login.Password, model.Login.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
return LocalRedirect(returnUrl);
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(model);
}
}
return View(model);
}
我做错了事,因为出现以下错误:NullReferenceException:对象引用未设置为对象的实例。 引用此行:var userOrEmail = model.Login.Email;
答案 0 :(得分:1)
您绑定了错误的属性。
控制器动作期望的对象类型为LoginRegisterViewModel,
,这是视图所期望的模型的类型,但是控件绑定到错误的属性。
例如<input type="text" name="Email" id="Email" placeholder="Email">
映射到model.Email(其中model是LoginRegisterViewModel的对象),并且LoginRegisterViewModel
没有Email
属性,但是具有{{1 }}属性具有Email属性,因此您应该将输入绑定到LoginModel
。
Ps:您可以使用MVC核心标签助手将属性绑定到模型
model.Login.Email
甚至是剃刀语法
<input asp-for="model.Login.Email" name="anyothername" class="form-control" />
答案 1 :(得分:0)
就知道了。我应该在视图中使用name =“ Login.Email”和name =“ Login.Password”。