2012-09-14 73 views
1

我試圖從ValidationAttribute拉取客戶端驗證規則。有問題的驗證器通過使用DataAnnotationsModelValidatorProvider.RegisterAdapter作爲適配器附加的DataAnnotationsModelValidator附加了客戶端驗證規則。獲取MVC驗證屬性適配器

但是,我不知道如何在運行時讓適配器恢復原狀。 任何幫助,將不勝感激。

感謝,安德魯

+0

你是什麼意思,說「讓適配器回到運行時」? – Dima

+0

可能不是單詞的最佳選擇。我真的只是想要檢索由DataAnnotationsModelValidatorProvider.RegisterAdapter附加的那些。 – Boomtown

+0

我不確定您可以輕鬆獲取,因爲它們存儲在內部字典中。更好的選擇是跟蹤自己添加到提供商的適配器。 – VJAI

回答

0

你需要使用反射來獲取與屬性的財產MemberInfo對象。然後,

// given memberInfo, controllerContext, and modelMetadata 
// (see below on how to get metadata) 
foreach (var attribute in memberInfo.GetCustomAttributes(typeof(ValidationAttribute), true) 
{ 
    var clientValidationAttribute = attribute as IClientValidatable; 
    if (clientValidationAttribute == null) 
    { 
     continue; 
    } 

    var clientValidationRules = clientValidationAttribute.GetClientValidationRules(modelMetadata, controllerContext); 

    // do something with the rules 
} 

要獲取模型元數據,你可以叫

ModelMetadata.FromLambdaExpression(expression, viewData) 

,如果您有可視數據得心應手。您也可以通過顯式調用ModelMetadataProvider來獲取它。讓我知道你是否需要更多細節。

+0

這將爲您提供作爲IClientValidatable的一部分直接添加到Attribute的規則。我在詢問有關使用DataAnnotationsModelValidatorProvider.RegisterAdapter註冊DataAnnotationsModelValidator的規則。還是)感謝你的建議。 – Boomtown

0

看看這個例子here - 顯示模板拉字符串長度驗證器(如果存在)並相應地添加html屬性。這裏是相關的代碼:

IEnumerable<ModelValidator> validators = ModelValidatorProviders.Providers.GetValidators(ViewData.ModelMetadata, ViewContext); 
ModelClientValidationRule stringLengthRule = validators.SelectMany(v => v.GetClientValidationRules()).FirstOrDefault(m => m.ValidationType == "stringLength");