当用户通过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. 博客的QQ群群规

    本人博客园博客夏天的森林相关的QQ群一共有3个,它们分别是Web前端及Web开发技术群(群号:262413025).JS及Web前端技术群(群号:35079861)和Web服务端技术群(群号:3414 ...

  2. Linux head和tail命令

    200 ? "200px" : this.width)!important;} --> 介绍 head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. ...

  3. 根据Excel的内容和word模板生成对应的word文档

    Sub setname() Dim I As Integer Dim pspname As String Dim pspnumber As String Dim path As String Dim ...

  4. 手把手教你用python打造网易公开课视频下载软件5-python生成exe程序

    python程序生成exe文件,使用的是py2exe扩展包,下面写下具体的步骤: 第一步:新建conver2exe.py,内容如下: #coding:utf-8 from distutils.core ...

  5. Vue.js2.0从入门到放弃---入门实例

    最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...

  6. Atititi tesseract使用总结

    Atititi tesseract使用总结 消除bug,优化,重新发布.当前版本为3.02 项目下载地址为:http://code.google.com/p/tesseract-ocr. Window ...

  7. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)

    基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编   ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...

  8. Maven Myeclipse 搭建项目

    一.maven概述 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具! 简单说Maven 是一个项目管理和构建自动化工具 二.环境搭建 1. ...

  9. CSS图片裁剪Clip

    CSS Clip 裁剪 可以用它来裁剪一张图片噢. 我们来裁剪一下Google图标,把G字给裁剪下来. 注意这个clip得配合绝对定位才能使用,不然不起效果. rect (top, right, bo ...

  10. 实现CSS等分布局的4种方式

    × 目录 [1]float [2]inline-block [3]table[4]flex 前面的话 等分布局是指子元素平均分配父元素宽度的布局方式,本文将介绍实现等分布局的4种方式 思路一: flo ...