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

时间:2016-08-09 18:55:06

标签: .net entity-framework validation attributes

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

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

1 个答案:

答案 0 :(得分:2)

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参数覆盖方法,测试仍会继续通过。