当用户通过UI输入数据向程序交互时,都会出现一个潜在的错误,数据错误,要检查用户提交的数据是否正确,需要做数据验证,在ASP.NET MVC中,每当Action执行前都会对传入Action的Model进行格式各样的验证,这些验证都是通过MVC中的验证组件ModelValidator来执行,不同的ModelValidator担当不同的验证任务,验证时会根据编码员的设置来使用不同的ModelValidator来执行,而不同的ModelValidator又由相应的ModelValidator来提供,下面则是整体的类图。

ModelValidator: 抽象类,GetClientValidateRule,用于获取客户端验证规则;IsRequire属性,表明成员必须要执行验证,默认返回false;Validate,具有验证功能的方法,返回ModelValidatorResult集合,若成功通过则返回Null、空集或ValitionResult。

ModelValidatorResult:存放成员验证的结果,MemberName属性存放的是成员的名称,Message属性存放的是错误信息,如果验证的对象是Model自身,则MemberName属性是空串,在验证失败时返回的是这个类的实例。

ValidationResult:只在部分情况下验证成功时返回这个类的实例,有静态只读成员Success。

DataAnnotationsModelValidator: 继承ModelValidator,用于处理特性式的验证,如RequiredAttribute。

ClientModelValidator: 继承ModelValidator,仅用于客户端的验证,Validate方法是服务端 的验证方法,所以此处总返回的空集,GetClientValidateRule返回客户端验证规则。

NumericModelValidator & DateModelValidator:继承ClientModelValidator,分别针对number和date验证 ,验证的错误消息在内部维护的资源文件中获取,这促使无法对消息进行定制。

IDataErrorInfo:成员Error是自身错误信息,索引器用于获取成员属性。

DataErrorClassModelValidator & DataErrorPropertyModelValidator: 继承ModelValidator,都是内部类型,处理实现了IDataErrorInfo的类的实例,前者针对于类,后者针对成员(特指属性),通过书上的例子,鄙人推断验证的逻辑是定义在实现了IDataErrorInfo的类中,Validator验证类只是直接调用Model的属性来获取验证的结果。

IValidatableObject:这个接口代表的是另一种验证模式,是数据对象针对自己的验证,传入的是验证的上下文,返回的是ValidationResult。

ValidatableAdapter:继承ModelValidator,用于处理实现了IValidaableObject的类的验证。

ModelValidatorProvider:抽象类,所有提供者的的积累,用于提供ModelValidator,GetValidator方法是根据ModelMetadata元数据和ControllerContext控制器上下文返回ModelValidator的集合。

AssocatedValidatorProvider:继承ModelValidatorProvider,主要是从ModelMetadata提取的Attribute构建ModelValidator,GetTypeDescriptor根据给定的Type获取描述对象,机制:验证是某个类的属性时,会根据GetTypeDescriptor获取描述类Descriptor,再从Descriptor获取特性,最后从特性中获取ModelValidator,这个Validator就是AssocatedValidatorProvider要提供的Validator。

DataAnnotationsModelValidatorProvider:继承了AssocatedValidatorProvider,提供DataAnnotationsModelValidator,机制:使用从AssocatedValidatorProvider继承GetValidator方法,从传入的ModelMetadata选出集成ValidationAttribute的特性,从而创建出DataAnnotationsModelValidator。

ClientDataTypeModelValidatorProvider:继承ModelValidatorProvider,提供NumericModelValidator和DateModelValidator,它会根据ModelMetadata分辨出数字(所有的byte,int,float,decimal等,无论有符号还是没符号ubyte这类)和日期。

DataErrorInfoModelValidatorProvider:继承ModelValidatorProvider,提供DataErrorClassModelValidator 和 DataErrorPropertyModelValidator,提供机制:被验证对象是实现IDataError接口,则返回的集合中有DataErrorClassModelValidator;被验证对象是容器属性,返回的集合中有DataErrorPropertyModelValidator,简而言之一个类实现了IDataError接口,会返回DataErrorClassModelValidator以及验证到的属性的DataErrorPropertyModelValidator。

ModelValidatorProviderCollection: ModelValidatorProvider的集合,管理各个Provider,在构造本类是加入上述三个Provider,集合中的Provider可增可删,自定义的Provider也是如此。

ModelValidatorProviders:通过一个静态属性Providers引用上面的ModelValidatorProviderCollection。

CompositeModelValidator:继承ModelValidator,这是一个私有类,验证时实际调用的这个类,内部自动识别各种验证方式,从而调用不同的ModelValidatorProvider生成ModelValidator,通常的验证顺序是先验证了类的成员,再验证类的本身,自下而上。

ASP.NET MVC ModelValidator小结的更多相关文章

  1. ASP.NET MVC ValueProvider小结

    在Model绑定中,Model的数据来源有很多种,在MVC里面则定义了一套ValueProvider的组件来处理Model数据来源多样性的问题,ValueProvider整个结构类似于字典(Dictr ...

  2. 学习“迷你ASP.NET MVC框架”后的小结

    看蒋老师MVC的书第二个大收获可以是算是看了这个迷你ASP.NET MVC框架了,虽然它远不如真正ASP.NET MVC(下文简称“MVC”)那么复杂庞大,但在迷你版中绕来绕去也够呛的.这部分我看了几 ...

  3. ASP.NET MVC 下拉列表使用小结

    ASP.NET MVC中下拉列表的用法很简单,也很方便,具体来说,主要是页面上支持两种Html帮助类的方法:DropDownList()和DropDownListFor().这篇博文主要作为个人的一个 ...

  4. ASP.NET MVC 5入门小结

    1.前言        本人在读研究僧一只,老师那里使用的是ASP.NET的Web Forms技术,真的要感慨一句:尼玛太老旧了!之前耳闻Python的高效开发,曾经学过一点Python的Django ...

  5. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  8. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  9. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

随机推荐

  1. FusionCharts简单教程(六)-----如何自定义图表上的工具提示

          所谓图表上的工具提示就是当鼠标放在某个特定的数据块上时所显示的提示信息.如下: 禁用显示工具提示       在默认情况下工具提示功能是显示的,但是有时候我们并不是很想需要这个功能提示功能 ...

  2. PHP爬虫(2)DOM处理

    摘要:在PHP爬虫(1)中详细了介绍了CURL抓取HTML数据的技术.采集数据处理也是爬虫技术中非常重要的部分.处理HTML数据可以用字符串查找,也可以利用正则表达式,但采用Dom处理是最高级的方法. ...

  3. Setting up SSL for SCM-Manager with Microsoft CA and TortoiseHg

    You can configure SSL for SCM-Manager so that the communication of your repositories are encrypted. ...

  4. TACACS.Net Group 配置

    Tacacs作为一个验证工具,其网站上资料较少,只有一些缺省配置,并且没有提到如果在应用中与其自带的Group功能做集成, 这里使用免费的windows 版的TACACS.net 作介绍http:// ...

  5. CentOS6.5下安装JDK

    之前一直没有完全的总结出一篇关于Linux下安装Java的过程,今天正好就整理下. 下载jdk 如果在官网下载比较慢,那么可以到我的云盘分享上,下载jdk 1.8.0的版本: 下载地址参考链接 解压缩 ...

  6. JAVA环境配置-Eclipse新建项目

    首先配置安装jdk和jre 安装如下: 然后配置变量环境:右键我的电脑--属性--高级系统设置--环境变量--系统变量--找到PATH--编辑 将安装配置的jdk的目录和jdk目录下的bin目录放入其 ...

  7. 我的Eclipse快捷键.

    所谓“工欲善其事必先利其器”,程序写多了,对于快捷键总有些特别的偏爱.在众多编辑器中,Eclipse算是用的比较多,也是最熟的. 最常用(也是最爱的:)) Ctrl+’ :  自动完成提示.这个快捷键 ...

  8. PHP性能优化工具–xhprof安装

    PHP性能优化工具–xhprof安装,这里我先贴出大致的步骤: 1.获取xhprof 2.编译前预处理 3.编译安装 4.配置php.ini 5.查看运行结果 那么下面我们开始安装xhprof工具吧: ...

  9. fir.im Weekly - 如何打造真正的工程师文化

    好的工程师,无法忍受低效且无趣的工作.优秀的技术团队应该自上而下的地推进技术平台化建设.DevOps.自动化构建.测试和部署流程,积极采用合适的第三方工具或创造工具,进行周期性的前沿技术分享等等. 先 ...

  10. python2与python3在windows下共存

    python有python2(工业版)和python3,有时候我们会希望电脑上既有python2也有python3,!假设我们已经安装好,python2和python3了, 接下来我们找到python ...