.net 实现自定义ValidationAttribute时应重写哪个IsValid方法

sd2nnvve  于 2023-03-20  发布在  .NET
关注(0)|答案(2)|浏览(98)

当我实现从ValidationAttribute类继承的自定义属性时,我总是覆盖bool IsValid(object value)方法,而忽略原型为ValidationResult IsValid(objet value, ValidationContext validationContext)的另一个方法。
也许,我应该重写第二个方法,即使我不使用验证上下文或结果(我使用带有EntityFramework和ModelState.IsValid控制器属性的验证)。或者继续忽略重载的方法。如果这样,我可以根据调用属性验证的上下文使对象有效或无效吗?下面代码中显示的情况有问题吗?

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);
        }
    }
}

我不知道是否有对象的误解或者我错过了一些要点。是否有一个方法我应该优先覆盖而不是另一个。我应该覆盖两个吗?

stszievb

stszievb1#

Steve格林在上面的评论中提供的链接启发了方法之间的差异并回答了这个问题。
返回bool的方法仍然存在,以实现向后兼容,但从.NET 4.0开始不再是抽象的。建议重写有权访问ValidationContext的方法。
这个(以及其他功能)使我们能够访问整个模型,即使验证器是在属性级别。使用属性级别验证器的巨大优势在于,错误是针对属性本身设置的,而不是类删除了使用Html.ValidationSummary的要求。由于验证错误是针对属性正确设置的,您的普通Html.ValidationForHtml.ValidationMessageFor帮助程序将拾取并显示针对无效表单字段的错误。
它是在一段时间以前(使用ASP.NETMVC3)编写的,但在.NET4.6框架中仍然有效。此外,我实现了bool IsValid(object value)方法的单元测试。即使我只使用ValidationContext参数覆盖该方法,测试也继续通过。

ws51t4hk

ws51t4hk2#

根据引用源,返回bool的重载已弃用,您应仅重写采用ValidationContext的重载:

/// Derived classes should not override this method as it is only available for backwards compatibility.
        /// Instead, implement <see cref="IsValid(object, ValidationContext)"/>.

不幸的是,在写这篇文章的时候,这个反对意见还没有出现在文档中。

相关问题