asp.net-core-2.0 - Asp.Net Core:如何正确地将数据从视图传递到控制器?
问题描述
我正在尝试使用视图模型将一些数据从视图传递到控制器。
鉴于我有类似的东西:
@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;
解决方案
您绑定到错误的属性。
控制器操作需要一个类型的对象,LoginRegisterViewModel,
它是您的视图期望的模型类型,但是您的控件绑定到错误的属性。
例如,<input type="text" name="Email" id="Email" placeholder="Email">
这映射到 model.Email(其中 model 是 LoginRegisterViewModel 的对象),并且LoginRegisterViewModel
没有Email
属性,但它具有LoginModel
具有 Email 属性的属性,因此您应该将输入绑定到model.Login.Email
.
Ps : 你可以使用 MVC 核心标签助手将属性绑定到模型
<input asp-for="model.Login.Email" name="anyothername" class="form-control" />
甚至剃刀语法
@Html.EditorFor(model => model.Login.Email)
推荐阅读
- c++ - 不确定如何装饰我的 C++ 库代码以在 C 中使用
- ruby-on-rails - 在 Rails 4 中使用 Haml 时缺少模板错误
- javascript - Blue Prism:无法使用注入的 JS 脚本遍历 JSON 项目
- sed - SED 在特定的多行文本字段之后插入文本
- python-3.x - numpy 代码在 REPL 中工作,脚本显示类型错误
- java - 如何同步 hazelcast 与 DB psql 的交互?
- python - 使用 if 语句过滤数据?
- javascript - 如何使用ajax在div中加载页面以确保加载javascripts?
- r - 在 group_by 之后使用列中的特定值减少数据帧
- bluetooth - 智能手机会自动开启附近的通知吗?