模型绑定
1.1模型绑定:以HTTP请求方式发送的数据来创建.NET对象的过程。每当定义具有参数的动作方法时,一直是在依赖着这种模型绑定过程
当导航到/Home/Index/1时,该URL的最后一个片段会被付给id路由变量,它指定了用户感兴趣的对象。
默认的动作调用器,ControllerActionInvoker,要依靠模型绑定器来生成调用动作所需要的数据对象。模型绑定器由IModelBinder定义。
namespace System.Web.Mvc{ // 摘要: // 定义模型联编程序所需的方法。 public interface IModelBinder{ // 摘要: // 使用指定的控制器上下文和绑定上下文将模型绑定到一个值。 // 参数: // controllerContext: // 控制器上下文。 // bindingContext: // 绑定上下文。 // 返回结果: // 绑定值。 object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext); } }
备注:模型绑定过程是通过模型绑定器来实现的,其目的是用请求中所包含的数据创建对象。
模型绑定的步骤:
检测目标对象的名称和类型
通过对象名称查找数据源,并找到可用数据
根据对象类型将找到的数据值转换成目标类型
通过对象名称、对象类型、和这种经过处理的数据来构建目标对象
将构建好的对象送给动作调用器,并由动作调用器将对象注入到目标动作方法中
1.3默认模型绑定器
DefaultModelBinder类查找参数数据的顺序
源 |
描述 |
Request.Form |
有用户在HTML的form元素中提供 |
RouteData.Values |
用应用程序路由获得的值 |
Request.QueryString |
包含在请求URL中的查询字符串部分的数据 |
Request.Files |
请求中上传的文件 |
只要找到一个值,搜索便停止。
绑定简单类型
当处理简单参数类型时,DefaultModelBinder会尝试使用System.ComponentModel.TypeDescriptor类,将已经从请求数据获得的字符串值转换成参数类型;也称基元类型。
绑定符合类型
当动作方法参数是复合类型时,DefaultModelBinder类将用反射来获取public属性集,然后依次逐一进行绑定。
public class HomeController : Controller{ public ActionResult CreatePerson(){ return View(new Person()); } [HttpPost] public ActionResult CreatePerson(Person p) { return View("Index", p); } }
首先不带参数的CreatePerson重载创建了一个新的Person对象,并将其传递给View(),渲染Views/Home/Createperson.cshtml视图,用于展示新创建Person对象页。
在表单提交给CreatePerson时,形成了一种不同的模型绑定情况。默认模型绑定器发现,动作方法需要一个Person对象,于是会一次处理每个属性。对于简单类型,绑定器从请求中找到一个值;对于复合类型该过程会针对新类型重复执行,通过反射获取该类型的public属性集,而绑定器也会视图找出所有属性的值。
模型验证
是确保用户所接收的数据适合于绑定到模型,并且在不合适时,给用户提供有用的信息,以帮助修正问题的过程。
ModelState.AddModelError():指定由问题的属性和一条应该显示给用户的消息
ModelState.IsValidField():检查模型绑定器是否能够对一个属性赋值
ModelState.IsValid():判断是否有错误
用元数据指定验证规则
System.ComponentModel.DataAnnotations下
Compare 比较两个属性是否相同的值
Range 一个数字的值的范围
RegularExpression 输入的字符串必须匹配正则
Required 非空
StringLength 字符串长度