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 ...
随机推荐
- 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...
- mac命令
mac下卸载nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}xc ...
- NSString NSNumber 相互转化
NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init]; NSNumber *firstNum = [NSNumber n ...
- tomcat 5.5 动态加载类
转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735 开发使用的是tomcat5.5. ...
- redis中使用redis-dump导出、导入、还原数据实例
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/109.html?1455861283 redis的备份和还原,借助了第三方 ...
- spring 学习
一.spring框架介绍 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供 ...
- mysql如果数据不存在,则插入新数据,否则更新的实现方法
mysql如果数据不存在,则插入新数据,否则更新的实现方法 //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table('cat_lang')} ( ...
- Java时间日期格式转换
1.这个是系统自动默认的时间格式,或者说是美式格式: Long time = System.currentTimeMillis(); Date date = new Da ...
- javaweb回顾第九篇EL表达式
前言:关于EL表示式开发用的非常多,现在我们回顾一下关于如果去操作EL表达式 1:EL表达式语法 所有EL表达式都是由{开始}结束,表达式中用.和[]操作符来访问数据比喻${user.userName ...
- CSS选择器、CSS hack及CSS执行效率
主要内容: 1.CSS选择器.优先级与匹配原理 2. CSS 引入的方式有哪些 ? link 和 @import 的区别是 ? 3.CSS hack 4.如何书高效CSS 一.CSS选择器.优先级与 ...