我試圖從ValidationAttribute拉取客戶端驗證規則。有問題的驗證器通過使用DataAnnotationsModelValidatorProvider.RegisterAdapter作爲適配器附加的DataAnnotationsModelValidator附加了客戶端驗證規則。獲取MVC驗證屬性適配器
但是,我不知道如何在運行時讓適配器恢復原狀。 任何幫助,將不勝感激。
感謝,安德魯
我試圖從ValidationAttribute拉取客戶端驗證規則。有問題的驗證器通過使用DataAnnotationsModelValidatorProvider.RegisterAdapter作爲適配器附加的DataAnnotationsModelValidator附加了客戶端驗證規則。獲取MVC驗證屬性適配器
但是,我不知道如何在運行時讓適配器恢復原狀。 任何幫助,將不勝感激。
感謝,安德魯
你需要使用反射來獲取與屬性的財產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來獲取它。讓我知道你是否需要更多細節。
這將爲您提供作爲IClientValidatable的一部分直接添加到Attribute的規則。我在詢問有關使用DataAnnotationsModelValidatorProvider.RegisterAdapter註冊DataAnnotationsModelValidator的規則。還是)感謝你的建議。 – Boomtown
看看這個例子here - 顯示模板拉字符串長度驗證器(如果存在)並相應地添加html屬性。這裏是相關的代碼:
IEnumerable<ModelValidator> validators = ModelValidatorProviders.Providers.GetValidators(ViewData.ModelMetadata, ViewContext);
ModelClientValidationRule stringLengthRule = validators.SelectMany(v => v.GetClientValidationRules()).FirstOrDefault(m => m.ValidationType == "stringLength");
你是什麼意思,說「讓適配器回到運行時」? – Dima
可能不是單詞的最佳選擇。我真的只是想要檢索由DataAnnotationsModelValidatorProvider.RegisterAdapter附加的那些。 – Boomtown
我不確定您可以輕鬆獲取,因爲它們存儲在內部字典中。更好的選擇是跟蹤自己添加到提供商的適配器。 – VJAI