Asp.Net核心:如何正确地将数据从视图传递到控制器?
Asp.Net Core: How to properly pass data from view to controller?
我正在尝试使用视图模型将一些数据从视图传递到控制器。
在我看来,我有这样的东西:
@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;
刚收到。我应该在视图中使用 name="Login.Email" 和 name="Login.Password" 。
您绑定了错误的属性。
控制器操作需要一个 LoginRegisterViewModel,
类型的对象,它是您的视图所期望的模型类型,但是您的控件绑定到错误的 属性。
例如 <input type="text" name="Email" id="Email" placeholder="Email">
这映射到 model.Email (其中模型是 LoginRegisterViewModel 的对象),并且 LoginRegisterViewModel
没有 Email
属性 但它有一个 LoginModel
属性 ,其中有电子邮件 属性 ,所以你应该将你的输入绑定到 model.Login.Email
.
Ps :您可以使用 MVC 核心标记助手将属性绑定到模型
<input asp-for="model.Login.Email" name="anyothername" class="form-control" />
甚至是剃刀语法
@Html.EditorFor(model => model.Login.Email)
我正在尝试使用视图模型将一些数据从视图传递到控制器。
在我看来,我有这样的东西:
@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;
刚收到。我应该在视图中使用 name="Login.Email" 和 name="Login.Password" 。
您绑定了错误的属性。
控制器操作需要一个 LoginRegisterViewModel,
类型的对象,它是您的视图所期望的模型类型,但是您的控件绑定到错误的 属性。
例如 <input type="text" name="Email" id="Email" placeholder="Email">
这映射到 model.Email (其中模型是 LoginRegisterViewModel 的对象),并且 LoginRegisterViewModel
没有 Email
属性 但它有一个 LoginModel
属性 ,其中有电子邮件 属性 ,所以你应该将你的输入绑定到 model.Login.Email
.
Ps :您可以使用 MVC 核心标记助手将属性绑定到模型
<input asp-for="model.Login.Email" name="anyothername" class="form-control" />
甚至是剃刀语法
@Html.EditorFor(model => model.Login.Email)