文章出處

在《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
   3:     //其他成員
   4:     public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules();
object container);
   6:  
   7:     public virtual bool IsRequired { get; }
   2: {  
   3:     public string MemberName { get; set; }
   4:     public string Message { get; set; }
   2: {
   4:     public static readonly ValidationResult Success;
   2: {
   3:     public abstract IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
   2: {   
   3:     public static ModelValidatorProviderCollection Providers { get; }
   5:  
   6: public class ModelValidatorProviderCollection : Collection<ModelValidatorProvider>
   8:     public ModelValidatorProviderCollection();
   9:     public ModelValidatorProviderCollection(IList<ModelValidatorProvider> list);
  10:     public IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);   
   2: {
   4:     public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context);
如右圖所示的UML列出了組成Model驗證系統的三個核心類型。具體的Model驗證工作總是通過某個具體的ModelValidator來完成,作為 ModelValidator提供者的ModelValidatorProvider注冊在靜態類型ModelValidatorProviders之 上。

二、DataAnnotationsModelValidator

我們在《ASP.NET MVC下的四種驗證編程方式》 中介紹了三種不同的“自動化驗證”的編程方式,ASP.NET MVC在內部會采用不同的ModelValidator來對綁定的參數實施驗證。一個具體的ModelValidator通常有相應的 ModelValidatorProvider來提供,接下來的內容中將對ASP.NET MVC提供的原生的ModelValidator和對應的ModelValidatorProvider作詳細的介紹。

對于上面提到的這三種驗證編程方式,第一種(利用應用在數據類型或其數據成員上的ValidationAttribute特性來定義相應的驗證規 則)是最為常用的。基于ValidationAttribute特性這種聲明式驗證解決方案最終通過 DataAnnotationsModelValidator來完成。一個DataAnnotationsModelValidator對象實際上是對一 個ValidationAttribute特性的封裝,這可以從如下所示的定義看出來。

1: public class DataAnnotationsModelValidator : ModelValidator
   3:     public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute);
   4:     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules();
   5:  
object container);
   7:  
   8:     protected internal ValidationAttribute     Attribute { get; }
   9:     protected internal string                  ErrorMessage { get; }
  10:     public override bool                       IsRequired { get; }
   2: {
   3:     public ValidatableObjectAdapter(ModelMetadata metadata, ControllerContext context);
object container);
   2: {
   3:     public DataErrorInfoClassModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
   6:  
   8: {
   9:     public DataErrorInfoPropertyModelValidator(ModelMetadata metadata, ControllerContext controllerContext);
object container);
   1: public class DataErrorInfoModelValidatorProvider : ModelValidatorProvider
   3:     public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context);
   4: }
上一篇 ASP.NET MVC下的四種驗證編程方式
原文:http://www.cnblogs.com/artech/p/asp-net-mvc-4-validation.html

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()