首页 > 代码库 > 模型绑定与验证笔记

模型绑定与验证笔记

模型绑定

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);

    }

}
View Code

 

备注模型绑定过程是通过模型绑定器来实现的,其目的是用请求中所包含的数据创建对象

模型绑定的步骤:

检测目标对象的名称和类型

通过对象名称查找数据源,并找到可用数据

根据对象类型将找到的数据值转换成目标类型

通过对象名称、对象类型、和这种经过处理的数据来构建目标对象

将构建好的对象送给动作调用器,并由动作调用器将对象注入到目标动作方法中

 

1.3默认模型绑定器

DefaultModelBinder类查找参数数据的顺序

描述

Request.Form

有用户在HTMLform元素中提供

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 字符串长度

模型绑定与验证笔记