我正在尝试从 ValidationAttribute 中提取客户端验证规则。有问题的验证器具有通过 DataAnnotationsModelValidator 附加的客户端验证规则,该 DataAnnotationsModelValidator 使用 DataAnnotationsModelValidatorProvider.RegisterAdapter 作为适配器附加。
但是,我一生都无法弄清楚如何在运行时恢复适配器。任何帮助,将不胜感激。
谢谢,安德鲁
我正在尝试从 ValidationAttribute 中提取客户端验证规则。有问题的验证器具有通过 DataAnnotationsModelValidator 附加的客户端验证规则,该 DataAnnotationsModelValidator 使用 DataAnnotationsModelValidatorProvider.RegisterAdapter 作为适配器附加。
但是,我一生都无法弄清楚如何在运行时恢复适配器。任何帮助,将不胜感激。
谢谢,安德鲁
看一下这个例子-显示模板拉取字符串长度验证器(如果存在)并相应地添加 html 属性。以下是相关代码:
IEnumerable<ModelValidator> validators = ModelValidatorProviders.Providers.GetValidators(ViewData.ModelMetadata, ViewContext);
ModelClientValidationRule stringLengthRule = validators.SelectMany(v => v.GetClientValidationRules()).FirstOrDefault(m => m.ValidationType == "stringLength");
您需要使用反射来获取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 来获取它。如果您需要更多细节,请告诉我。