ASP.NET MVC ModelValidator小结
当用户通过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小结的更多相关文章
- ASP.NET MVC ValueProvider小结
在Model绑定中,Model的数据来源有很多种,在MVC里面则定义了一套ValueProvider的组件来处理Model数据来源多样性的问题,ValueProvider整个结构类似于字典(Dictr ...
- 学习“迷你ASP.NET MVC框架”后的小结
看蒋老师MVC的书第二个大收获可以是算是看了这个迷你ASP.NET MVC框架了,虽然它远不如真正ASP.NET MVC(下文简称“MVC”)那么复杂庞大,但在迷你版中绕来绕去也够呛的.这部分我看了几 ...
- ASP.NET MVC 下拉列表使用小结
ASP.NET MVC中下拉列表的用法很简单,也很方便,具体来说,主要是页面上支持两种Html帮助类的方法:DropDownList()和DropDownListFor().这篇博文主要作为个人的一个 ...
- ASP.NET MVC 5入门小结
1.前言 本人在读研究僧一只,老师那里使用的是ASP.NET的Web Forms技术,真的要感慨一句:尼玛太老旧了!之前耳闻Python的高效开发,曾经学过一点Python的Django ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model验证(四)
ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...
- ASP.NET MVC Model验证(三)
ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...
随机推荐
- 如何为编程爱好者设计一款好玩的智能硬件(十)——无线2.4G通信模块研究·一篇说完
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- ios NSLog常见使用
NSLog常见输出格式 Table 1 Format specifiers supported by the NSString formatting methods and CFString for ...
- MVVM架构~knockoutjs系列之验证信息自定义输出
返回目录 这个文章非常重要,也是非常必要的,在我们进行项目开发时,后台无所谓,对样式无要求,而网站前台来说,对样式要求严格,你的验证信息都是前台设计好的,所以,不能使用knockoutjs自带的了,我 ...
- yar粗略使用记录
yar是鸟哥(laruence)开发的一个并行的RPC框架.据说sina weibo已经在大规模使用这个框架了.今天初步使用了下,觉得还是挺爽的一个工具. 什么情况适用这个工具呢? 比如一般你有个微博 ...
- Mybatis文档阅读笔记(明日继续更新...)
今天在编写mybatis的mapper.xml时,发现对sql的配置还不是很熟,有很多一坨一坨的东西,其实是可以抽取成服用的.不过良好的组织代码,还是更重要的.
- Jquery实现一组复选框单选
完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- asp.net/html清理页面缓存的方法
(1) MVC BaseController: Controller内 protected override void Initialize(System.Web.Routing.RequestC ...
- 高并发、海量数据处理尽量少使用using也能提升效率
请看下面两段: 第一种方式: MemoryStream stream = new MemoryStream(); string text = "aasasdfasdfad;sas;fkqew ...
- JTMz换路径导致MySQL服务不能启动的问题
问题: JTMz解压到我的机器上,运行一次后,把服务停止了,然后移到了另外一个路径,JTMz中自带的MySQL服务启动不起来了. 解决: 在注册表中修改 HKEY_LOCAL_MACHINE\SYST ...
- silverlight MouseLeftButtonDown事件总是无法触发
参考解决办法:http://www.cnblogs.com/tianguook/archive/2011/05/13/2045299.html 在构造函数中首先添加一个事件: public BtnLi ...