Fra*_*ock 5 .net validation attributes entity-framework
当我实现从ValidationAttribute类继承的自定义属性时,我总是会覆盖bool IsValid(object value)方法,而不是将其原型为的另一个方法ValidationResult IsValid(objet value, ValidationContext validationContext)。
也许,即使我不使用验证上下文或结果(我对EntityFramework和ModelState.IsValidcontroller属性使用验证),也应该改写第二种方法。或继续忽略重载方法。如果是这样,根据调用属性验证的上下文,我可以使一个对象有效还是无效?如下面的代码所示,这种情况是否有问题?
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道是否存在对象误解,或者我是否缺少某些要点。有没有一种我应该优先替代的方法。我应该同时覆盖两者。
Steve Greene 在上述评论中提供的链接阐明了方法之间的区别并回答了问题。
返回 a 的方法bool仍然存在以实现向后兼容性,但自 .NET 4.0 以来不再是抽象的。建议覆盖可以访问ValidationContext.
这(除其他外)使我们可以访问整个模型,即使验证器处于属性级别。使用属性级别验证器的巨大优势在于,错误是针对属性本身设置的,而不是针对删除使用 Html.ValidationSummary 的要求的类。由于验证错误是针对属性正确设置的,因此您的正常
Html.ValidationForHtml.ValidationMessageFor helpers 将选取并显示针对无效表单字段的错误。
它是在不久前编写的(使用 ASP.NET MVC 3),但在 .NET 4.6 框架中仍然有效。此外,我为该bool IsValid(object value)方法实现了单元测试。即使我只用ValidationContext参数覆盖方法,测试也会继续通过。