当用户通过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. 使用decode函数实现统计

          从上个星期起就在开始做统计图,各种统计图,昨天做的统计效果图如下:       在这里要根据工作平台和机构做统计,其中当字段A等于某个值时需要统计起来,也就是说假设等于2时需要做统计,字段 ...

  2. js模版引擎handlebars.js实用教程——each-基本循环使用方法

    返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...

  3. 让C#轻松实现读写锁分离--封装ReaderWriterLockSlim

    ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...

  4. Visual Studio 2015 速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

  5. java初学者应掌握的30个基本概念

    核心提示:OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why. 基本概念 ...

  6. WPF入门教程系列七——布局之WrapPanel与StackPanel(二)

    三. WrapPanel WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列,当长度或高度不够是就会自动调整进行换行,后续排序按照从上至下或从右至左的顺序进行. Orientation— ...

  7. Python内建的对象列表

    Python内建的对象列表 刚写Python肯定会遇到这样的情况,想写些什么,但又不知从何写起... 在我看来问题在于我们不知道有什么东东可以拿来玩,这里列出Python的内建对象,稍微归类了一下,多 ...

  8. AMD 和 CMD 的区别有哪些?

    看到玉伯在介绍seajs和requirejs时,说“RequireJS 遵循的是 AMD(异步模块定义)规范,SeaJS 遵循的是 CMD (通用模块定义)规范”. 能否详细(举例)说明下这个2个规范 ...

  9. Android Handler的使用示例:结合源码理解Android Handler机制(一)

    什么是Handler? Android 的官方解释: 文档分节1:A Handler allows you to send and process Message and Runnable objec ...

  10. 什么是WeakHashMap--转

    原文地址:http://laravel.iteye.com/blog/2303244 Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用 ...