博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC下的四种验证编程方式[续篇]【转】
阅读量:5298 次
发布时间:2019-06-14

本文共 3296 字,大约阅读时间需要 10 分钟。

在《》 一文中我们介绍了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
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
GetValidators(ModelMetadata metadata, ControllerContext context);
2: {
3:     public static ModelValidatorProviderCollection Providers { get; }
5: 
6: public class ModelValidatorProviderCollection : Collection
8:     public ModelValidatorProviderCollection();
9:     public ModelValidatorProviderCollection(IList
list);
10:     public IEnumerable
GetValidators(ModelMetadata metadata, ControllerContext context);
2: {
4:     public virtual IEnumerable
GetValidators(ControllerContext context);
 
如右图所示的UML列出了组成Model验证系统的三个核心类型。具体的Model验证工作总是通过某个具体的ModelValidator来完成,作为 ModelValidator提供者的ModelValidatorProvider注册在静态类型ModelValidatorProviders之 上。

二、DataAnnotationsModelValidator

我们在《》 中介绍了三种不同的“自动化验证”的编程方式,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
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
GetValidators(ModelMetadata metadata, ControllerContext context);
4: } 上一篇 原文:http://www.cnblogs.com/artech/p/asp-net-mvc-4-validation.html

转载于:https://www.cnblogs.com/X-Jonney/p/4636261.html

你可能感兴趣的文章
GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
查看>>
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
JavaScript动画打开半透明提示层
查看>>