当前位置:首页 > 联系方式 >

ASP.NET MVC下的四种验证编程方式[续篇]

ASP.NET MVC下的四种验证编程方式[续篇] 在《ASP.NET MVC下的四种验证编程方式》一文中我们介绍了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

2: {

3: //其他成员

4: public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules();

5: public abstract IEnumerable<ModelValidationResult> Validate(object container);

6:

7: public virtual bool IsRequired { get; }

8: }

针对目标数据的验证是通过调用Validate方法来完成的,该方法的输入参数container表示的正是被验证的对象。正是因为被验证的总是一个复杂类型的对象,后者又被称为一个具有若干数据成员的“容器”对象,所以对应的参数被命名为container。Validate方法表示验证结果的返回值并不是一个简单的布尔值,而是一个元素类型为具有如下定义的ModelValidationResult对象集合。

1: public class ModelValidationResult

2: {

3: public string MemberName { get; set; }

4: public string Message { get; set; }

5: }

ModelValidationResult具有两个字符串类型属性MemberName和Message,前者代表被验证数据成员的名称,后者表示错误消息。一般来说,如果ModelValidationResult对象来源于针对容器对象本身的验证,它的MemberName属性为空字符串。对于针对容器对象某个属性的验证来说,属性名称会作为返回的ModelValidationResult对象的MemberName属性。

ModelValidationResult集合只有在验证失败的情况下才会返回。如果被验证数据对象符合所有的验证规则,Validate方法会直接返回Null或者一个空ModelValidationResult集合。值得一提的是,我们有时候会用ValidationResult的静态只读字段Success表示成功通过验证的结果,实际上该字段的值就是Null。

1: public class ValidationResult

2: {

3: //其他成员

4: public static readonly ValidationResult Success;

5: }

ModelValidator具有一个布尔类型的只读属性IsRequired表示该ModelValidator是否对目标数据进行“必需性”验证(即被验证的数据成员必须具有一个具体的值),该属性默认返回False。我们可以通过应用RequiredAttribute特性将某个属性定义成“必需”的数据成员。

我们知道ASP.NET MVC大都采用Provider的模式来提供相应的组件,比如描述Model元数据的ModelMetadata通过对应的ModelMetadataProvider来提供,实现Model绑定的ModelBinder则可以通过对应的ModelBinderProvider来提供,用于实现Model验证的ModelValidator也不例外,专题系统,它对应的提供者为ModelValidatorProvider,对应的类型继承自具有如下定义的抽象类ModelValidator Provider。

1: public abstract class ModelValidatorProvider

2: {

3: public abstract IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);

4: }

如上面的代码片段所示,GetValidators方法具有两个参数,一个是用于描述被验证类型或者属性Model元数据的ModelMetadata对象,另一个是当前ControllerContext。该方法返回的是一个元素类型为ModelValidator的集合。

ASP.NET MVC 通过静态类型ModelValidatorProviders对使用的ModelValidatorProvider进行注册。如下面的代码片段所示,ModelValidatorProviders具有一个静态只读属性Providers,对应的类型为ModelValidatorProviderCollection,它表示基于整个Web应用范围的全局ModelValidatorProvider集合。

1: public static class ModelValidatorProviders

2: {

3: public static ModelValidatorProviderCollection Providers { get; }

4: }

5:

6: public class ModelValidatorProviderCollection : Collection<ModelValidatorProvider>

7: {

8: public ModelValidatorProviderCollection();

9: public ModelValidatorProviderCollection(IList<ModelValidatorProvider> list);

10: public IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);

11: }

值得一提的是用于描述Model元数据的ModelMetadata类型具有如下一个GetValidators方法,它返回的ModelValidator列表正是利用注册到ModelValidatorProviders静态属性Providers上的ModelValidatorProvider创建的。

1: public class ModelMetadata

2: {

3: //其他成员

4: public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);

5: }

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:潜江SEO http://qianjiang.4567w.com

上一篇:PHP+Ajax+Mysql联合实现省市区三级联动

下一篇:最后一页