ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidatorProvider
2012-06-08 13:28
459 查看
[code] public class DataAnnotationsModelValidatorProvider : AssociatedValidatorProvider
{
//其他成员
internal static readonly Dictionary<Type, DataAnnotationsModelValidationFactory> AttributeFactories;
internal static DataAnnotationsModelValidationFactory DefaultAttributeFactory;
internal static DataAnnotationsValidatableObjectAdapterFactory DefaultValidatableFactory;
internal static readonly Dictionary<Type, DataAnnotationsValidatableObjectAdapterFactory> ValidatableFactories;
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, HttpActionContext actionContext, IEnumerable<Attribute> attributes);
}
public delegate ModelValidator DataAnnotationsModelValidationFactory(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
public delegate ModelValidator DataAnnotationsValidatableObjectAdapterFactory(ModelMetadata metadata, ControllerContext context);
[/code]
[/code]
基于ValidationAttribute的ModelValidator的创建
委托DataAnnotationsModelValidationFactory根据ModelMetadata、ControllerContext和ValidationAttribute返回一个ModelValidator对象,而字段AttributeFactories表示的字典对象的Key是具体的验证特性的类型,也就是说它维护一个ValidationAttribute特性类型和对应ModelValidator工厂的匹配关系。在重写的GetValidators方法中,针对指定的每一个ValidationAttribute,它先根据其类型从AttributeFactories中获取一个对应的DataAnnotationsModelValidationFactory委托,如果该委托存在,则用它来创建相应的ModelValidator对象;否则就采用字段DefaultAttributeFactory表示的DataAnnotationsModelValidationFactory委托来进行ModelValidator的创建。基于IValidatableObject的ModelValidator的创建
除了AttributeFactories和DefaultAttributeFactory,DataAnnotationsModelValidatorProvider还具有DefaultValidatableFactory和ValidatableFactories这两个静态属性,它们用于针对可验证对象(实现了IValidatableObject接口)的ModelValidator的创建。DataAnnotationsModelValidator的类型是另外一个类型为DataAnnotationsValidatableObjectAdapterFactory的委托,该委托根据ModelMetadata和ControllerContext创建相应的ModelValidator。ValidatableFactories是一个以此委托为Value,以Type对象为Key的字典。当DataAnnotationsModelValidatorProvider完成了针对基于验证特性的ModelValidator的创建之后,如果根据Model元数据解析出来的Model类型实现了IValidatableObject接口,那么先从字典ValidatableFactories中根据此类型获取一个对应的DataAnnotationsValidatableObjectAdapterFactory委托,如果匹配的委托对象存在,则用其进行ModelValidator的创建;否则采用通过字段DefaultValidatableFactory表示的默认工厂来创建相应的ModelValidator对象。
默认的ModelValidator创建机制
在DataAnnotationsModelValidatorProvider类型被加载的时候,上述的四个字段会在静态构造函数调用时被初始化。从如下的代码片断可看出,对于一般的ValidationAttribute,对应的ModelValidator是一个DataAnnotationsModelValidator对象(DefaultAttributeFactory字段);针对RangeAttribute、RegularExpressionAttribute 、RequiredAttribute和StringLengthAttribute这四种验证特性,它们对应的适配ModelValidator会被创建出来。而对于可验证对象来说,默认情况下提供的ModelValidator列表中还包含一个ValidatableObjectAdapter对象。
[code][code] public class DataAnnotationsModelValidatorProvider : AssociatedValidatorProvider
{
//其他成员
static DataAnnotationsModelValidatorProvider()
{
//1、DefaultAttributeFactory
DefaultAttributeFactory = (metadata, context, attribute) => new DataAnnotationsModelValidator(metadata, context, attribute);
//2、AttributeFactories
Dictionary<Type, DataAnnotationsModelValidationFactory> dictionary = new Dictionary<Type, DataAnnotationsModelValidationFactory>();
dictionary.Add(typeof(RangeAttribute), (metadata, context, attribute) => new RangeAttributeAdapter(metadata, context, (RangeAttribute)attribute));
dictionary.Add(typeof(RegularExpressionAttribute), (metadata, context, attribute) => new RegularExpressionAttributeAdapter(metadata, context, (RegularExpressionAttribute)attribute));
dictionary.Add(typeof(RequiredAttribute), (metadata, context, attribute) => new RequiredAttributeAdapter(metadata, context, (RequiredAttribute)attribute));
dictionary.Add(typeof(StringLengthAttribute), (metadata, context, attribute) => new StringLengthAttributeAdapter(metadata, context,(StringLengthAttribute)attribute));
AttributeFactories = dictionary;
//3、DefaultValidatableFactory
DefaultValidatableFactory = (metadata, context) => new ValidatableObjectAdapter(metadata, context);
//4、ValidatableFactories
ValidatableFactories = new Dictionary<Type, DataAnnotationsValidatableObjectAdapterFactory>();
}
}
[/code]
[/code]
对ModelValidator创建方式的定制
DataAnnotationsModelValidatorProvider四个基于委托的静态字段体现了其采用的ModelValidator提供机制。由于它们都是内部字段,我们不能直接对其进行操作,但是如下所示的一系列静态方法在DataAnnotationsModelValidatorProvider中定义出来,使我们可以按照具体的需要对默认的ModelValidator进行定义。
[code][code] public class DataAnnotationsModelValidatorProvider : AssociatedValidatorProvider
{
//其他成员
public static void RegisterAdapter(Type attributeType, Type adapterType);
public static void RegisterAdapterFactory(Type attributeType, DataAnnotationsModelValidationFactory factory);
public static void RegisterDefaultAdapter(Type adapterType);
public static void RegisterDefaultAdapterFactory(DataAnnotationsModelValidationFactory factory);
public static void RegisterDefaultValidatableObjectAdapter(Type adapterType);
public static void RegisterDefaultValidatableObjectAdapterFactory(DataAnnotationsValidatableObjectAdapterFactory factory);
public static void RegisterValidatableObjectAdapter(Type modelType, Type adapterType);
public static void RegisterValidatableObjectAdapterFactory(Type modelType, DataAnnotationsValidatableObjectAdapterFactory factory);
}
[/code]
[/code]
对于上面的8个静态方法,除了RegisterDefaultAdapter和RegisterValidatableObjectAdapter之外,其余的都很好理解。RegisterDefaultAdapter用于注册一个默认的针对验证特性的ModelValidator类型,该类型必须具有一个参数类型列表为ModelMetadata、ControllerContext和Attribute的构造函数。如果根据 验证特性的类型找到了匹配的DataAnnotationsModelValidationFactory委托对象,相应的参数会被传入该构造函数并最终创建一个我们注册的ModelValidator对象。
RegisterValidatableObjectAdapter和RegisterDefaultAdapter比较类似,用于注册一个默认的针对可验证对象类型的ModelValidator,有该类型必须具有一个参数类型列表为ModelMetadata和ControllerContex的构造函数。如果根据 验证特性的类型找到了匹配的DataAnnotationsValidatableObjectAdapterFactory委托对象,相应的参数会被传入该构造函数并最终创建一个我们注册的ModelValidator对象。
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验证:DataAnnotationsModelValidator
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
- 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验证体系: ModelValidatorProvider
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProvider
- HTML5中custom data-*特性与asp.net mvc 3 表单验证
- Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidatorProviders
- Asp.net MVC 通过Attribute验证datamodel(一)
- Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性
- asp.net mvc源码分析-ModelValidatorProviders 客户端的验证
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator