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;
}
}
}
ValidationAttribute 與 IValidatableObject,最核心。NumericModelValidator/DateModelValidator。IDataErrorInfo 介面驗證。// 新增
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.GetValidators(ControllerContext) 直接委派給 ModelValidatorProviders.Providers.GetValidators(this, context),形成統一入口。

ModelValidatorProviderCollection 聚合多 Provider,對外呈現單一介面。ModelValidator 實例。繼承 DataAnnotationsModelValidatorProvider,覆寫 GetValidators:
ControllerContext.RouteData.DataTokens 或 ActionDescriptor 取得當前 ValidationRule 名稱。RuleName 符合的 ValidationAttribute。ModelValidatorProviders 為全域單一註冊點,ModelValidatorProviderCollection 聚合多策略,ModelMetadata 提供統一存取入口。掌握此架構可輕鬆擴充、替換或組合驗證邏輯,支援多租戶、多情境等進階需求。