• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET MVC下的四种验证编程方式[续篇]

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

作者:Artech 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Artech通过本文主要向大家介绍了asp net mvc,asp net mvc 4,asp net mvc 5,精通asp.net mvc 5,精通asp.net mvc 4等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

一、ModelValidator与ModelValidatorProvider

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

 public abstract class ModelValidator
 {
 //其他成员
 public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules();
 public abstract IEnumerable<ModelValidationResult> Validate(object container);
 
 public virtual bool IsRequired { get; }
 }
</div>

针对目标数据的验证是通过调用Validate方法来完成的,该方法的输入参数container表示的正是被验证的对象。正是因为被验证的总是一个复杂类型的对象,后者又被称为一个具有若干数据成员的“容器”对象,所以对应的参数被命名为container。Validate方法表示验证结果的返回值并不是一个简单的布尔值,而是一个元素类型为具有如下定义的ModelValidationResult对象集合。

 public class ModelValidationResult
 { 
 public string MemberName { get; set; }
 public string Message { get; set; }
 }
</div>

ModelValidationResult具有两个字符串类型属性MemberName和Message,前者代表被验证数据成员的名称,后者表示错误消息。一般来说,如果ModelValidationResult对象来源于针对容器对象本身的验证,它的MemberName属性为空字符串。对于针对容器对象某个属性的验证来说,属性名称会作为返回的ModelValidationResult对象的MemberName属性。

ModelValidationResult集合只有在验证失败的情况下才会返回。如果被验证数据对象符合所有的验证规则,Validate方法会直接返回Null或者一个空ModelValidationResult集合。值得一提的是,我们有时候会用ValidationResult的静态只读字段Success表示成功通过验证的结果,实际上该字段的值就是Null。

 public class ValidationResult
 {
 //其他成员
 public static readonly ValidationResult Success;
 }
</div>

ModelValidator具有一个布尔类型的只读属性IsRequired表示该ModelValidator是否对目标数据进行“必需性”验证(即被验证的数据成员必须具有一个具体的值),该属性默认返回False。我们可以通过应用RequiredAttribute特性将某个属性定义成“必需”的数据成员。

我们知道ASP.NET MVC大都采用Provider的模式来提供相应的组件,比如描述Model元数据的ModelMetadata通过对应的ModelMetadataProvider来提供,实现Model绑定的ModelBinder则可以通过对应的ModelBinderProvider来提供,用于实现Model验证的ModelValidator也不例外,它对应的提供者为ModelValidatorProvider,对应的类型继承自具有如下定义的抽象类ModelValidator Provider。

 public abstract class ModelValidatorProvider
 {
 public abstract IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
 }
</div>

如上面的代码片段所示,GetValidators方法具有两个参数,一个是用于描述被验证类型或者属性Model元数据的ModelMetadata对象,另一个是当前ControllerContext。该方法返回的是一个元素类型为ModelValidator的集合。

ASP.NET MVC 通过静态类型ModelValidatorProviders对使用的ModelValidatorProvider进行注册。如下面的代码片段所示,ModelValidatorProviders具有一个静态只读属性Providers,对应的类型为ModelValidatorProviderCollection,它表示基于整个Web应用范围的全局ModelValidatorProvider集合。

 public static class ModelValidatorProviders
 { 
 public static ModelValidatorProviderCollection Providers { get; }
 }
 public class ModelValidatorProviderCollection : Collection<ModelValidatorProvider>
 { 
 public ModelValidatorProviderCollection();
 public ModelValidatorProviderCollection(IList<ModelValidatorProvider> list);
 public IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context); 
 }
</div>

值得一提的是用于描述Model元数据的ModelMetadata类型具有如下一个GetValidators方法,它返回的ModelValidator列表正是利用注册到ModelValidatorProviders静态属性Providers上的ModelValidatorProvider创建的。

 public class ModelMetadata
 {
 //其他成员
 public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);
 }
</div>

如右图所示的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特性的封装,这可以从如下所示的定义看出来。

 public class DataAnnotationsModelValidator : ModelValidator
 { 
 public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
 public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
 public override IEnumerable<ModelValidationResult> Validate(object container);
 
 protected internal ValidationAttribute Attribute { get; }
 protected internal string   ErrorMessage { get; }
 public override bool   IsRequired { get; }
 }
</div>

DataAnnotationsModelValidator的提供者为DataAnnotationsModelValidatorProvider,关于ValidationAttribute、DataAnnotationsModelValidator和DataAnnotationsModelValidatorProvider的详细内容可以参考之前写的三篇文章。

ASP.NET MVC基于标注特性的Model验证:ValidationAttribute

ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator

ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider

三、ValidatableObjectAdapter

如果被验证的数据类型实现了IValidatable接口,ASP.NET MVC会自动调用实现的Validate方法对其实施验证,此时创建的ModelValidator是一个ValidatableObjectAdapter对象。ValidatableObjectAdapter定义如下,其Validate方法的实现逻辑很简单:它直接调用被验证对象的Validate方法,并将返回的ValidationResult对象转换成ModelValidationResult类型。

 public class ValidatableObjectAdapter : ModelValidator
 {
 public ValidatableObjectAdapter(ModelMetadata metadata, ControllerContext context);
 public override IEnumerable<ModelValidationResult> Validate(object container);
 }
</div>

虽然ValidatableObjectAdapter继承自ModelValidator,但是ASP.NET MVC貌似没有将其视为一个真正意义上的ModelValidator,而是将其视为一个“适配器(Adapter)”。ASP.NET MVC也没有为ValidatableObjectAdapter定义单独的ModelValidatorProvider,它的提供者其实是上面提到过的DataAnnotationsModelValidatorProvider。

四、DataErrorInfoModelValidator

如果我们让数据类型实现IDataErrorInfo接口,可以利用实现的Error属性和索引提供

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET MVC从视图传参到控制器的几种形式
  • ASP.NET MVC 4 中的JSON数据交互的方法
  • ASP.NET MVC制作404跳转实例(非302和200)
  • 详解ASP.NET MVC 利用Razor引擎生成静态页
  • 详解ASP.NET MVC 解析模板生成静态页(RazorEngine)
  • ASP.NET MVC4 利用uploadify.js多文件上传
  • ASP.NET mvc4中的过滤器的使用
  • Asp.net MVC下使用Bundle合并、压缩js与css文件详解
  • 详解Asp.Net MVC——控制器与动作(Controller And Action)

相关文章

  • 2017-05-11asp.net 添加水印的代码(已测试)
  • 2017-05-11ASP.NET中Cookie状态的说明与用法
  • 2017-05-11基于.Net的单点登录(SSO)实现解决方案
  • 2017-05-11ASP.NET编程获取网站根目录方法小结
  • 2017-05-11ASP.NET笔记之 行命令处理与分页详解
  • 2017-05-11获取ashx得到的内容(已处理好的数据)
  • 2017-05-11asp.net中利用ashx实现图片防盗链的原理分析
  • 2017-05-11firebird Embedded模式(.net 3.5)
  • 2017-05-11asp.net实现C#绘制太极图的方法
  • 2017-05-11Asp.net实现无刷新调用后台实体类数据并以Json格式返回

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • .NET framework 4.0 安装失败回滚问题
    • C#,winform,ShowDialog,子窗体向父窗体传值
    • Repeater控件与PagedDataSource结合实现分页功能
    • asp.net操作Word实现批量替换
    • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
    • 使用DataTable更新数据库(增,删,改)
    • 获取DataRow[]的值示例
    • SignalR发送页面跳转通知的方法
    • 浏览器窗口滚动加载数据采用异步形式从后台加载数据
    • .NET中OpenFileDialog使用线程报错的解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有