当我实现从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);
}
}
}
我不知道是否存在对象误解,或者我是否遗漏了某些观点。是否有一种方法我应该优先覆盖而不是另一种方法。我应该覆盖两者吗。
答案 0 :(得分:2)
Steve Greene在上面的评论中提供的链接启发了方法之间的差异并回答了问题。
返回bool
的方法仍然存在以实现向后兼容,但自.NET 4.0以来不再是抽象的。建议覆盖有权访问ValidationContext
。
这(除其他外)给了我们 即使验证者在物业,也可以访问整个模型 水平。使用属性级验证器的巨大优势是 错误是针对属性本身而不是类设置的 删除使用Html.ValidationSummary的要求。自从 验证错误是正确设置属性,你的正常
Html.ValidationForHtml.ValidationMessageFor帮助器将拾取并显示错误 无效的表单字段。
它是在不久前编写的(使用ASP.NET MVC 3),但在.NET 4.6框架下仍然有效。另外,我实现了bool IsValid(object value)
方法的单元测试。即使我只使用ValidationContext
参数覆盖方法,测试仍会继续通过。