在实现自定义ValidationAttribute时,我应该覆盖哪种IsValid方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在实现自定义ValidationAttribute时,我应该覆盖哪种IsValid方法相关的知识,希望对你有一定的参考价值。

当我实现从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);
        }
    }
}

我不知道是否存在客观误解,或者我是否遗漏了一些观点。是否有一种方法我应该优先覆盖而不是另一种方法。我应该覆盖两者。

答案

Steve Greene在上面的评论中提供的链接启发了方法之间的差异并回答了问题。

为了向后兼容,返回bool的方法仍然存在,但自.NET 4.0以来不再是抽象的。建议覆盖有权访问ValidationContext的方法。

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

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

以上是关于在实现自定义ValidationAttribute时,我应该覆盖哪种IsValid方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Asp.net Core MVC 中定义自定义客户端验证规则

ASP.NET MVC3 - 自定义验证属性 -> 客户端损坏

自定义参数验证

jQuery Unobtrusive 客户端验证自定义属性

自定义验证属性不触发 jQuery 验证

使用 DataAnnotations 比较两个模型属性