在ASP.Net MVC2中注入动态模型验证参数的首选方法

时间:2010-04-29 11:45:06

标签: asp.net-mvc asp.net-mvc-2

假设我的模型有付款日期

public class PaymentModel
{
    [PaymentDateValid]
    public DateTime PaymentDate { get; set; }
}

我创建了一个源自ValidationAttribute的自定义验证器PaymentDateValid。验证者需要从数据库中查找最新的付款日期,并验证提交的付款日期是否在最后的付款日期之后。

假设有某种存储库或服务用于获取最新的付款日期,并且可以从容器中获取这些日期。客户端验证不是必需的,但是很高兴。

将这些动态验证参数注入验证器的最佳方法是什么?或者有更好的方法来执行数据驱动验证吗?

1 个答案:

答案 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());