实现自定义ValidationAttribute时应覆盖哪个IsValid方法

Fra*_*ock 5 .net validation attributes entity-framework

当我实现从ValidationAttribute类继承的自定义属性时,我总是会覆盖bool IsValid(object value)方法,而不是将其原型为的另一个方法ValidationResult IsValid(objet value, ValidationContext validationContext)

也许,即使我不使用验证上下文或结果(我对EntityFramework和ModelState.IsValidcontroller属性使用验证),也应该改写第二种方法。或继续忽略重载方法。如果是这样,根据调用属性验证的上下文,我可以使一个对象有效还是无效?如下面的代码所示,这种情况是否有问题?

class StrictlyPreviousAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var dateTime = value as DateTime?;
        return dateTime == null || dateTime <= DateTime.Today;
    }
}

class PreviousAttribute : StrictlyPreviousAttribute 
{
    public override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var dateTime = value as DateTime?;

        if(dateTime == DateTime.Today)
        {
            return ValidationResult.Success;
        }
        else
        {
            return base.IsValid(object);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道是否存在对象误解,或者我是否缺少某些要点。有没有一种我应该优先替代的方法。我应该同时覆盖两者。

Fra*_*ock 5

Steve Greene 在上述评论中提供的链接阐明了方法之间的区别并回答了问题。

返回 a 的方法bool仍然存在以实现向后兼容性,但自 .NET 4.0 以来不再是抽象的。建议覆盖可以访问ValidationContext.

这(除其他外)使我们可以访问整个模型,即使验证器处于属性级别。使用属性级别验证器的巨大优势在于,错误是针对属性本身设置的,而不是针对删除使用 Html.ValidationSummary 的要求的类。由于验证错误是针对属性正确设置的,因此您的正常 Html.ValidationFor Html.ValidationMessageFor helpers 将选取并显示针对无效表单字段的错误。

它是在不久前编写的(使用 ASP.NET MVC 3),但在 .NET 4.6 框架中仍然有效。此外,我为该bool IsValid(object value)方法实现了单元测试。即使我只用ValidationContext参数覆盖方法,测试也会继续通过。