Model Binding 允许我们用 HTTP 请求里的数据来创建 C# 对象,这个对象就是 Action 方法的参数。
可以使用以下类型用来 Model Binding:
• int,string 等简单类型
• 复杂类型对象
• 数组
示例:
将 localhost/Albums/Detail/3 绑定到 AlbumController 的 Details(int id) 方法
Model Binder
Model Binding 主要依赖于 Model Binder。Model Binder 从 HTTP 请求的不同部分寻找参数,并将其组合绑定到 Action 的参数。
Model Binder 默认寻找范围:
• Form 表单提交的值
• 路由的值
• QueryString 的值
Binding Attributes
通过 Binding Attributes 自定义绑定。
• Bind:有选择的绑定属性
• BindNever:指定属性不需要绑定
• BindRequired:指定属性必须绑定
示例:使用 Bind 仅绑定 UserName 和 Email 属性,其他属性都是默认值
指定 Binding 来源
• FromBody:Request Bodys
• FromQuery:QueryStrings
• FromHeader:Request Headers
• FromRoute
• FromForm
public ActionResult List(
[FromQuery] int id,
[FromHeader(Name = "Accept")] string accept)
{
...
}
比如这里AddUser这个 Action绑定的是UserCreateViewModel这个模型,从HTTP 请求里发来的数据就会映射到这个模型上,从而在Action里构建这个模型的实体,这里是一个ApplicationUser对象,有时也返回自己的新实例对象,返回到客户端用于显示,这是mvvm模式最常用的数据处理逻辑
public async Task<IActionResult> AddUser(UserCreateViewModel userCreateViewModel)
{
//模型验证
if (!ModelState.IsValid)
{
return View(userCreateViewModel);
}
//创建user实体
var user = new ApplicationUser
{
UserName = userCreateViewModel.UserName,
Email = userCreateViewModel.Email,
BirthDay = userCreateViewModel.BirthDay,
IDCard = userCreateViewModel.IDCard
};
var result = await _userManager.CreateAsync(user, userCreateViewModel.PassWord);
if (result.Succeeded)
{
return RedirectToAction("UserIndex");
}
foreach (IdentityError error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return View(userCreateViewModel);
}