首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC ModelValidatorProviders:全域註冊與 Validator 聚合機制

     編輯:關於ASP.NET

ModelValidatorProviders 靜態註冊中心

ModelValidatorProviders.Providers 為 ModelValidatorProviderCollection,維護應用程式層級的 Provider 清單:

public static class ModelValidatorProviders
{
    public static ModelValidatorProviderCollection Providers { get; }
}

public class ModelValidatorProviderCollection : Collection<ModelValidatorProvider>
{
    public IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
    {
        foreach (var provider in this)
        {
            foreach (var validator in provider.GetValidators(metadata, context))
                yield return validator;
        }
    }
}

預設三大 Provider

  1. DataAnnotationsModelValidatorProvider:處理 ValidationAttribute 與 IValidatableObject,最核心。
  2. ClientDataTypeModelValidatorProvider:針對數值/日期型別產生客戶端 NumericModelValidator/DateModelValidator。
  3. DataErrorInfoModelValidatorProvider:支援 IDataErrorInfo 介面驗證。

自訂 Provider 註冊與替換

// 新增
ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider());

// 替換內建(如擴充 DataAnnotationsModelValidatorProvider)
var old = ModelValidatorProviders.Providers.FirstOrDefault(p => p is DataAnnotationsModelValidatorProvider);
if (old != null) ModelValidatorProviders.Providers.Remove(old);
ModelValidatorProviders.Providers.Add(new ExtendedDataAnnotationsModelValidatorProvider());

ModelMetadata 整合入口

ModelMetadata.GetValidators(ControllerContext) 直接委派給 ModelValidatorProviders.Providers.GetValidators(this, context),形成統一入口。

UML 關係圖

ModelValidator、Provider、Providers UML 關係圖

關鍵設計模式

  • 策略模式:每個 Provider 代表一種驗證策略(DataAnnotations、IDataErrorInfo、ClientDataType)。
  • 複合模式:ModelValidatorProviderCollection 聚合多 Provider,對外呈現單一介面。
  • 工廠模式:Provider 負責建立具體 ModelValidator 實例。

擴充實戰:多規則驗證 Provider

繼承 DataAnnotationsModelValidatorProvider,覆寫 GetValidators:

  1. 從 ControllerContext.RouteData.DataTokens 或 ActionDescriptor 取得當前 ValidationRule 名稱。
  2. 篩選屬性上 RuleName 符合的 ValidationAttribute。
  3. 呼叫基類建立對應 Validator。

總結

ModelValidatorProviders 為全域單一註冊點,ModelValidatorProviderCollection 聚合多策略,ModelMetadata 提供統一存取入口。掌握此架構可輕鬆擴充、替換或組合驗證邏輯,支援多租戶、多情境等進階需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved