在《ASP.NET MVC下的四种验证编程方式》 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”、“标注ValidationAttribute特性”、“让数据类型实现 IValidatableObject或者IDataErrorInfo”),那么在ASP.NET MVC框架内部是如何提供针对这四种不同编程方式的支持的呢?接下来我们就来聊聊这背后的故事。

一、ModelValidator与ModelValidatorProvider

虽 然Model绑定的方式因被验证数据类型的差异而有所不同,但是ASP.NET MVC总是使用一个名为ModelValidator的对象来对绑定的数据对象实施验证。所有的ModelValidator类型均继承自具有如下定义的 抽象类ModelValidator。它的GetClientValidationRules方法返回一个元素类型为 ModelClientValidationRule的集合,而ModelClientValidationRule是对客户端验证规则的封装,我们会在 客户端验证部分对其进行详细介绍。

1: public abstract class ModelValidator

   3:     //其他成员
   4:     public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules();
object container);
   6:  
   7:     public virtual bool IsRequired { get; }
   2: {  
   3:     public string MemberName { get; set; }
   4:     public string Message { get; set; }
   2: {
   4:     public static readonly ValidationResult Success;
   2: {
   3:     public abstract IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
   2: {   
   3:     public static ModelValidatorProviderCollection Providers { get; }
   5:  
   6: public class ModelValidatorProviderCollection : Collection<ModelValidatorProvider>
   8:     public ModelValidatorProviderCollection();
   9:     public ModelValidatorProviderCollection(IList<ModelValidatorProvider> list);
  10:     public IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);   
   2: {
   4:     public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);

如右图所示的UML列出了组成Model验证系统的三个核心类型。具体的Model验证工作总是通过某个具体的ModelValidator来完成,作为 ModelValidator提供者的ModelValidatorProvider注册在静态类型ModelValidatorProviders之 上。

二、DataAnnotationsModelValidator

我们在《ASP.NET MVC下的四种验证编程方式》 中介绍了三种不同的“自动化验证”的编程方式,ASP.NET MVC在内部会采用不同的ModelValidator来对绑定的参数实施验证。一个具体的ModelValidator通常有相应的 ModelValidatorProvider来提供,接下来的内容中将对ASP.NET MVC提供的原生的ModelValidator和对应的ModelValidatorProvider作详细的介绍。

对于上面提到的这三种验证编程方式,第一种(利用应用在数据类型或其数据成员上的ValidationAttribute特性来定义相应的验证规 则)是最为常用的。基于ValidationAttribute特性这种声明式验证解决方案最终通过 DataAnnotationsModelValidator来完成。一个DataAnnotationsModelValidator对象实际上是对一 个ValidationAttribute特性的封装,这可以从如下所示的定义看出来。

1: public class DataAnnotationsModelValidator : ModelValidator

   3:     public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
   4:     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
   5:  
object container);
   7:  
   8:     protected internal ValidationAttribute     Attribute { get; }
   9:     protected internal string                  ErrorMessage { get; }
  10:     public override bool                       IsRequired { get; }
   2: {
   3:     public ValidatableObjectAdapter(ModelMetadata metadata, ControllerContext context);
object container);
   2: {
   3:     public DataErrorInfoClassModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
   6:  
   8: {
   9:     public DataErrorInfoPropertyModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
   1: public class DataErrorInfoModelValidatorProvider : ModelValidatorProvider
   3:     public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
   4: }
上一篇 ASP.NET MVC下的四种验证编程方式
原文:http://www.cnblogs.com/artech/p/asp-net-mvc-4-validation.html

ASP.NET MVC下的四种验证编程方式[续篇]【转】的更多相关文章

  1. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  2. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  3. ASP.NET MVC下的四种验证编程方式【转】

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...

  4. Asp.Net Core下的两种路由配置方式

    与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...

  5. 在ASP.NET MVC下扩展一个带验证的RadioButtonList

    在ASP.NET MVC4中,HtmlHelper为我们提供了Html.RadioButton()方法用来显示Radio Button单选按钮.如果想显示一组单选按钮,通常的做法是遍历一个集合把每个单 ...

  6. ASP.NET MVC 主要的四种过滤器和三种具体实现类

    4种常用过滤器(IAuthrorizationFilter.IActionFilter.IResultFilter.IExceptionFilter) 和 3种具体实现类(AuthorizeAttri ...

  7. 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)

    MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...

  8. ASP.NET MVC Model元数据(四)

    ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...

  9. SNF快速开发平台MVC-EasyUI3.9之-ueditor富文本编辑在 asp.net MVC下使用步骤

    mvc项目中用到了这个富文本编辑就试着把遇到的问题个使用步骤在这里记录一下,希望大家少走弯路. 1.首先我们先下载net版本的uediot 2.然后把整个文档拷贝到我们的项目中,记得是整个 把下载的文 ...

随机推荐

  1. [BS-03] 统一设置UITabBarController管理的所有VC的tabBarItem图标文字的颜色大小等属性

    1. 统一设置UITabBarController管理的所有VC的tabBarItem图标文字的颜色大小等属性 . 统一设置UITabBarController管理的所有VC的tabBarItem图标 ...

  2. python_遇到问题

    1. [出现问题]:cx_Oracle.DatabaseError: ORA-24315: 非法的属性类型 [原因]:是因为版本不兼容,检查了一下环境,我的oracle client是10g的,但我安 ...

  3. iOS 瀑布流的基本原理

    /** * 源代码链接 * 链接: https://pan.baidu.com/s/1nvLamEX 密码: kya5 */ #import <UIKit/UIKit.h> @interf ...

  4. startssl 申请证书,并在Nginx, apache, Tomcat上使用

    tomcat: http://blog.csdn.net/buyaore_wo/article/details/5771470 apache: http://blog.mowd.tw/index.ph ...

  5. oracle pl sql 解锁表

    select   p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name   from   v$pr ...

  6. 减去border边框

    width: 100%; border: 1px solid transparent; box-sizing: border-box;

  7. PostgreSQL中initdb做了什么

    在使用数据库前,是启动数据库,启动数据库前是initdb(初始化数据库):一起来看一下initdb做了什么吧. 初始化数据库的操作为: ./initdb -D /usr/local/pgsql/dat ...

  8. Leetcode: Create Maximum Number

    Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...

  9. csuoj 1022: 菜鸟和大牛

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1022 1022: 菜鸟和大牛 Time Limit: 1 Sec  Memory Limit: 1 ...

  10. maven的pom报plugins却是的解决方法(转)

    maven的pom报plugins却是的解决方法. 引用 Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom: ...