在《ASP.NET MVC下的四种验证编程方式》 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”、“标注ValidationAttribute特性”、“让数据类型实现 IValidatableObject或者IDataErrorInfo”),那么在ASP.NET MVC框架内部是如何提供针对这四种不同编程方式的支持的呢?接下来我们就来聊聊这背后的故事。

一、ModelValidator与ModelValidatorProvider

虽 然Model绑定的方式因被验证数据类型的差异而有所不同,但是ASP.NET MVC总是使用一个名为ModelValidator的对象来对绑定的数据对象实施验证。所有的ModelValidator类型均继承自具有如下定义的 抽象类ModelValidator。它的GetClientValidationRules方法返回一个元素类型为 ModelClientValidationRule的集合,而ModelClientValidationRule是对客户端验证规则的封装,我们会在 客户端验证部分对其进行详细介绍。

1: public abstract class ModelValidator

   3:     //其他成员
   4:     public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules();
object container);
   6:  
   7:     public virtual bool IsRequired { get; }
   2: {  
   3:     public string MemberName { get; set; }
   4:     public string Message { get; set; }
   2: {
   4:     public static readonly ValidationResult Success;
   2: {
   3:     public abstract IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
   2: {   
   3:     public static ModelValidatorProviderCollection Providers { get; }
   5:  
   6: public class ModelValidatorProviderCollection : Collection<ModelValidatorProvider>
   8:     public ModelValidatorProviderCollection();
   9:     public ModelValidatorProviderCollection(IList<ModelValidatorProvider> list);
  10:     public IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);   
   2: {
   4:     public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);

如右图所示的UML列出了组成Model验证系统的三个核心类型。具体的Model验证工作总是通过某个具体的ModelValidator来完成,作为 ModelValidator提供者的ModelValidatorProvider注册在静态类型ModelValidatorProviders之 上。

二、DataAnnotationsModelValidator

我们在《ASP.NET MVC下的四种验证编程方式》 中介绍了三种不同的“自动化验证”的编程方式,ASP.NET MVC在内部会采用不同的ModelValidator来对绑定的参数实施验证。一个具体的ModelValidator通常有相应的 ModelValidatorProvider来提供,接下来的内容中将对ASP.NET MVC提供的原生的ModelValidator和对应的ModelValidatorProvider作详细的介绍。

对于上面提到的这三种验证编程方式,第一种(利用应用在数据类型或其数据成员上的ValidationAttribute特性来定义相应的验证规 则)是最为常用的。基于ValidationAttribute特性这种声明式验证解决方案最终通过 DataAnnotationsModelValidator来完成。一个DataAnnotationsModelValidator对象实际上是对一 个ValidationAttribute特性的封装,这可以从如下所示的定义看出来。

1: public class DataAnnotationsModelValidator : ModelValidator

   3:     public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
   4:     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
   5:  
object container);
   7:  
   8:     protected internal ValidationAttribute     Attribute { get; }
   9:     protected internal string                  ErrorMessage { get; }
  10:     public override bool                       IsRequired { get; }
   2: {
   3:     public ValidatableObjectAdapter(ModelMetadata metadata, ControllerContext context);
object container);
   2: {
   3:     public DataErrorInfoClassModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
   6:  
   8: {
   9:     public DataErrorInfoPropertyModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
   1: public class DataErrorInfoModelValidatorProvider : ModelValidatorProvider
   3:     public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
   4: }
上一篇 ASP.NET MVC下的四种验证编程方式
原文:http://www.cnblogs.com/artech/p/asp-net-mvc-4-validation.html

ASP.NET MVC下的四种验证编程方式[续篇]【转】的更多相关文章

  1. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  2. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  3. ASP.NET MVC下的四种验证编程方式【转】

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...

  4. Asp.Net Core下的两种路由配置方式

    与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...

  5. 在ASP.NET MVC下扩展一个带验证的RadioButtonList

    在ASP.NET MVC4中,HtmlHelper为我们提供了Html.RadioButton()方法用来显示Radio Button单选按钮.如果想显示一组单选按钮,通常的做法是遍历一个集合把每个单 ...

  6. ASP.NET MVC 主要的四种过滤器和三种具体实现类

    4种常用过滤器(IAuthrorizationFilter.IActionFilter.IResultFilter.IExceptionFilter) 和 3种具体实现类(AuthorizeAttri ...

  7. 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)

    MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...

  8. ASP.NET MVC Model元数据(四)

    ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...

  9. SNF快速开发平台MVC-EasyUI3.9之-ueditor富文本编辑在 asp.net MVC下使用步骤

    mvc项目中用到了这个富文本编辑就试着把遇到的问题个使用步骤在这里记录一下,希望大家少走弯路. 1.首先我们先下载net版本的uediot 2.然后把整个文档拷贝到我们的项目中,记得是整个 把下载的文 ...

随机推荐

  1. 由单例模式学到:volatile关键字

    MSDN上说: volatile 关键字指示一个字段可以由多个同时执行的线程修改. 声明为 volatile 的字段不受编译器优化的限制. 这样可以确保该字段在任何时间呈现的都是最新的值. volat ...

  2. 关闭不安全的HTTP方法

    关闭不安全的HTTP方法 在项目或tomcat下的web.xml中,添加如下配置: <!-- 关闭不安全的HTTP方法 --> <security-constraint> &l ...

  3. 当标签上写了runat="server" 后,<%%>就会无效

    当标签上写了runat="server" 后,<%%>就会无效 //这是错误的写法 <input type="hidden" runat=&q ...

  4. IDisplayTransformation

    IDisplayTransformation Bounds Full extent in world coordinates. The Bounds property controls the ful ...

  5. Flask服务入门案例

    安装 pip install Flask 入门例子 from flask import Flask app = Flask(__name__) @app.route('/hello.world') d ...

  6. [转]qt中文乱码问题

    http://blog.csdn.net/brave_heart_lxl/article/details/7186631#

  7. 手动内存管理与ARC互相转换问题

  8. cocos2dx 3.x(多个按钮button执行同一事件的区分)

    // // ATTGamePoker.hpp // MalaGame // // Created by work on 2016/10/18. // // #ifndef ATTGamePoker_h ...

  9. RAC数据库迁移ASM磁盘组到其它存储

    环境介绍: 一共有两个磁盘组:crs和data:crs使用normal冗余:data使用外部冗余. 添加新的asm磁盘过程(略) 1.迁移前 SQL> select group_number, ...

  10. 数据库报ORA-00600: 内部错误代码, 参数: [17059],并产生大量trace日志文件

    用户反馈数据库服务器磁盘空间使用耗尽. 登录服务器后查看,发现数据库产生大量的trace日志,并在alert日志中发现ora-600错误 alert日志信息: Fri Jul :: Errors ): ...