假设我的模型有付款日期
public class PaymentModel
{
[PaymentDateValid]
public DateTime PaymentDate { get; set; }
}
我创建了一个源自ValidationAttribute的自定义验证器PaymentDateValid。验证者需要从数据库中查找最新的付款日期,并验证提交的付款日期是否在最后的付款日期之后。
假设有某种存储库或服务用于获取最新的付款日期,并且可以从容器中获取这些日期。客户端验证不是必需的,但是很高兴。
将这些动态验证参数注入验证器的最佳方法是什么?或者有更好的方法来执行数据驱动验证吗?
答案 0 :(得分:1)
要在运行时动态添加验证属性,您需要创建自定义ModelValidatorProvider:
public class MyCustomModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
var newAttributes = attributes;
//or whatever other criteria you need
if( metadata.PropertyName == "PaymentDate" )
newAttributes.Add( new PaymentDateValidAttribute() );
return base.GetValidators(metadata, context, newAttributes);
}
}
请记住通过global.asax注册您的自定义模型验证程序提供程序。
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new MyCustomModelValidatorProvider());