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,多种验证规则
相关文章推荐
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator
- ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
- ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
- ASP.NET MVC基于标注特性的Model验证:ValidationAttribute
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProviders
- HTML5中custom data-*特性与asp.net mvc 3 表单验证
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator
- Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性
- asp.net mvc源码分析-ModelValidatorProviders 客户端的验证
- Asp.net MVC 通过Attribute验证datamodel(二) ---使用IClientValidatable
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProviders
- Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性