【问题标题】:Which IsValid method should I override when implementing custom ValidationAttribute实现自定义 ValidationAttribute 时应该覆盖哪个 IsValid 方法
【发布时间】:2016-12-15 22:50:07
【问题描述】:

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

我不知道是否存在对对象的误解,或者我是否遗漏了一些要点。是否有一种方法我应该最好覆盖而不是其他方法。我应该同时覆盖两者吗?

【问题讨论】:

  • ValidationContext 使访问其他属性变得容易,并在 .NET 4.0 中添加。这是一个很好的描述:devtrends.co.uk/blog/…
  • @SteveGreene 我从您提供的链接中发布了相关部分。答案的功劳应该是你的。谢谢。

标签: .net entity-framework validation attributes


【解决方案1】:

史蒂夫格林在上述评论中提供的链接启发了方法之间的差异并回答了问题。

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

这(除其他外)给了我们 即使验证器在属性中,也可以访问整个模型 等级。使用属性级别验证器的巨大优势是 错误是针对属性本身而不是类设置的 删除使用 Html.ValidationSummary 的要求。由于 验证错误是针对属性正确设置的,你的正常 Html.ValidationFor Html.ValidationMessageFor 助手会拾取并显示针对的错误 无效的表单域。

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

【讨论】:

  • 显示属性验证错误的方法是Html.ValidationMessageFor不是Html.ValidationFor,是错误
  • 已更正! ValidationMessageForValidateFor 扩展方法之间可能会混淆。
猜你喜欢
  • 2016-04-18
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多