在实现自定义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 中定义自定义客户端验证规则