您的位置:首页 > 编程语言 > ASP

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

2012-06-07 10:54 597 查看
[code] public class DataAnnotationsModelValidator : ModelValidator

{

public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);

public override IEnumerable<ModelClientValidationRule>GetClientValidationRules();


 public override IEnumerable<ModelValidationResult> Validate(object container)

{

 ValidationContext validationContext = new ValidationContext(container ?? this.Metadata.Model, null, null)

{

 DisplayName = this.Metadata.GetDisplayName()

};

 ValidationResult validationResult = this.Attribute.GetValidationResult(this.Metadata.Model, validationContext);

 if (validationResult != ValidationResult.Success)

{

 ModelValidationResult iteratorVariable2 = new ModelValidationResult

{

 Message = validationResult.ErrorMessage

};

 yield return iteratorVariable2;

}

 else

{

 yield break;

}

}

 protected ValidationAttribute Attribute{ get;}

 protected string ErrorMessage{ get;}

 public override bool IsRequired{ get;}

}

[/code]
[/code]
我们给出了用于实施验证的核心方法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的类型,下面的代码片断反映了其定义:

[code]
[code] public class DataAnnotationsModelValidator<TAttribute> : DataAnnotationsModelValidator where TAttribute: ValidationAttribute

{

 public DataAnnotationsModelValidator(ModelMetadata metadata, ModelBindingExecutionContext context, TAttribute attribute);

 protected TAttribute Attribute{ get;}

}

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

[code]
[code] public class RequiredAttributeAdapter : DataAnnotationsModelValidator<RequiredAttribute>

{

 public RequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute);

 public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();

}


public class RangeAttributeAdapter : DataAnnotationsModelValidator<RangeAttribute>

{

 public RangeAttributeAdapter(ModelMetadata metadata, ControllerContext context, RangeAttribute attribute);

 public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();

}


public class RegularExpressionAttributeAdapter : DataAnnotationsModelValidator<RegularExpressionAttribute>

{

 public RegularExpressionAttributeAdapter(ModelMetadata metadata, ControllerContext context, RegularExpressionAttribute attribute);

 public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();

}


public class StringLengthAttributeAdapter : DataAnnotationsModelValidator<StringLengthAttribute>

{

 public StringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute);

 public override IEnumerable<ModelClientValidationRule>GetClientValidationRules();

}

[/code]
[/code]

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,多种验证规则
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐