ASP.NET MVC下的四种验证编程方式[续篇]【转】
在《ASP.NET MVC下的四种验证编程方式》 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”、“标注ValidationAttribute特性”、“让数据类型实现 IValidatableObject或者IDataErrorInfo”),那么在ASP.NET MVC框架内部是如何提供针对这四种不同编程方式的支持的呢?接下来我们就来聊聊这背后的故事。
一、ModelValidator与ModelValidatorProvider
虽 然Model绑定的方式因被验证数据类型的差异而有所不同,但是ASP.NET MVC总是使用一个名为ModelValidator的对象来对绑定的数据对象实施验证。所有的ModelValidator类型均继承自具有如下定义的 抽象类ModelValidator。它的GetClientValidationRules方法返回一个元素类型为 ModelClientValidationRule的集合,而ModelClientValidationRule是对客户端验证规则的封装,我们会在 客户端验证部分对其进行详细介绍。
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特性的封装,这可以从如下所示的定义看出来。
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下的四种验证编程方式[续篇]【转】的更多相关文章
- ASP.NET MVC下的四种验证编程方式[续篇]
在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...
- ASP.NET MVC下的四种验证编程方式
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...
- ASP.NET MVC下的四种验证编程方式【转】
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...
- Asp.Net Core下的两种路由配置方式
与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...
- 在ASP.NET MVC下扩展一个带验证的RadioButtonList
在ASP.NET MVC4中,HtmlHelper为我们提供了Html.RadioButton()方法用来显示Radio Button单选按钮.如果想显示一组单选按钮,通常的做法是遍历一个集合把每个单 ...
- ASP.NET MVC 主要的四种过滤器和三种具体实现类
4种常用过滤器(IAuthrorizationFilter.IActionFilter.IResultFilter.IExceptionFilter) 和 3种具体实现类(AuthorizeAttri ...
- 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)
MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...
- ASP.NET MVC Model元数据(四)
ASP.NET MVC Model元数据(四) 前言 前面的篇幅讲解了Model元数据生成的过程,并没有对Model元数据生成过程的内部和Model元数据结构的详细解释.看完本篇后将会对Model元数 ...
- SNF快速开发平台MVC-EasyUI3.9之-ueditor富文本编辑在 asp.net MVC下使用步骤
mvc项目中用到了这个富文本编辑就试着把遇到的问题个使用步骤在这里记录一下,希望大家少走弯路. 1.首先我们先下载net版本的uediot 2.然后把整个文档拷贝到我们的项目中,记得是整个 把下载的文 ...
随机推荐
- 7z usecaes
1. Archive without compressing 7z a -t7z -mx=0 OutputFilename InputFilename Descryption: a: command, ...
- H3C S3600-28TP-SI配置命令
模式分类为:<H3C> 用户视图 [H3C] 系统视图 [H3C-Ethernet1/0/1] 以太网端口视图 [H3C-vlan10] VLAN视图 [H3C-Vl ...
- OGRFeature的DestroyFeature方法
Ogr的销毁DestroyFeature方法: void OGRFeature::DestroyFeature( OGRFeature *poFeature ) { delete poFeature; ...
- 说说 PWA 和微信小程序--Progressive Web App
作者:云图图链接:https://zhuanlan.zhihu.com/p/22578965来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 利益相关:微信小用户,谷歌小 ...
- Python生成8位随机密码
#!/usr/bin/env python # -*- coding: utf- -*- import random import string #第一种方法 seed = "1234567 ...
- Java NIO学习(一)
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...
- java 笔记(3) —— 动态代理,静态代理,cglib代理
0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...
- java collections读书笔记(8)collection框架总览(1)
- PHP——字符串处理部分
PHP——字符串处理 下面我们来讲一下我们经常使用的一些字符串处理的函数 1.string(变量);——取这个变量里面的字符串的长度 2.var_dump(变量a,变量b);——判断两个变量里面的字符 ...
- Good Bye 2013
C:有点这种题的经验,先存起来相等的 D:赛后还搓了好久的代码,其实长度就100,枚举两边情况,其实A和C就涵盖了所有情况!所以到2就可以了,而且我弄出了有多少个后,和两边情况,也不知道能否或怎么凑成 ...
