• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

对于ASP.NET MVC基于标注特性的Model验证,很多人只知道应用在数据类型及其属性上用于定义验证规则和错误消息的ValidationAttribute。通过《ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator》的介绍,我们知道了最终用于进行Model验证的是一个叫做ModelValidator的组件。ValidationAttribute对应的ModelValidator为DataAnnotationsModelValidator,这篇简短的文章为你介绍ASP.NET MVC是如何针对Validation来创建DataAnnotationsModelValidator,以及后者如何利用前者实施Model验证的。[本文已经同步到《How ASP.NET MVC Works?》中]

ModelValidator是真正用于进行Model验证的组件,上面介绍的验证特性最终被封装成DataAnnotationsModelValidator对象进而被应用到Model验证系统中。如下面的代码片断所示,被封装的ValidationAttribute通过只读属性Attribute表示,该属性在构造函数中被初始化。

class DataAnnotationsModelValidator : ModelValidator
   2: {
public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
override IEnumerable<ModelClientValidationRule>  GetClientValidationRules();
   5:  
object container)
   7:     {
null)
   9:         {
this.Metadata.GetDisplayName()
  11:         };
this.Metadata.Model, validationContext);
if (validationResult != ValidationResult.Success)
  14:         {
new ModelValidationResult
  16:             {
  17:                 Message = validationResult.ErrorMessage
  18:             };
return iteratorVariable2;
  20:         }
else
  22:         {
break;
  24:         }
  25:     }
protected ValidationAttribute Attribute { get; }
string ErrorMessage { get; }
bool IsRequired { get; }
  29: }

我们给出了用于实施验证的核心方法Validate的完整定义。在该方法中,基于被验证对象(如果为Null则采用Model元数据的Model属性)创建出表示当前验证上下文的ValidationContext对象,并采用Model元数据的DisplayName属性作为该上下文的显示名称。最后直接调用被封装的ValidationAttribute的GetValidationResult方法对指定对象实施验证,如果返回的ValidationResult对象不为空,则以此创建ModelValidationResult对象并返回。

顺便在说说定义在DataAnnotationsModelValidator中的另外两个受保护只读属性的逻辑。用于返回错误消息的ErrorMessage属性来源对对ValidationAttribute的FormatErrorMessage方法的调用,而指定的参数就是当前Model元数据的DisplayName属性。由于只有RequiredAttribute才用于必需字段的验证,所有只有被封装ValidationAttribute为RequiredAttribute时其IsRequired属性返回True。

二、DataAnnotationsModelValidator<TAttribute>

DataAnnotationsModelValidator<TAttribute>是DataAnnotationsModelValidator的子类,其泛型参数为相应的ValidationAttribute的类型,下面的代码片断反映了其定义:

where TAttribute: ValidationAttribute
   2: {    
public DataAnnotationsModelValidator(ModelMetadata metadata, ModelBindingExecutionContext context, TAttribute attribute);
protected TAttribute Attribute { get; }
   5: }

作为DataAnnotationsModelValidator与相应ValidationAttribute之间的适配,ASP.NET MVC为常用的ValidationAttribute(RequiredAttribute、RangeAttribute、RegularExpressionAttribute和StringLengthAttribute)定义相应的适配类型。如下面的代码片断所示,它们都是泛型的DataAnnotationsModelValidator<TAttribute>的子类。当我们将这些ValidationAttribute应用到Model类型时,真正用于Model验证的实际上就是这些作为适配的ModelValidator。

class RequiredAttributeAdapter : DataAnnotationsModelValidator<RequiredAttribute>
   2: {
public RequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute);
override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
   5: }
   6:  
class RangeAttributeAdapter : DataAnnotationsModelValidator<RangeAttribute>
   8: {    
public RangeAttributeAdapter(ModelMetadata metadata, ControllerContext context, RangeAttribute attribute);
override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
  11: }
  12:  
class RegularExpressionAttributeAdapter : DataAnnotationsModelValidator<RegularExpressionAttribute>
  14: {    
public RegularExpressionAttributeAdapter(ModelMetadata metadata, ControllerContext context, RegularExpressionAttribute attribute);
override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
  17: }
  18:  
class StringLengthAttributeAdapter : DataAnnotationsModelValidator<StringLengthAttribute>
  20: {    
public StringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute);
override IEnumerable<ModelClientValidationRule>GetClientValidationRules();
  23: }

 

ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator
ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET杂谈---web.config发布时间:2022-07-10
下一篇:
asp.net动态值到flash中显示发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap