使用.NET Framework 4.5,ValidationAttribute
类现在有一个名为RequiresValidationContext
的新Boolean
属性。
我现在已经挖了很长时间了,我找不到这个属性的用途。这个的difault值是false,我最初认为如果将其设置为false,则调用以下方法:
public virtual bool IsValid(object value)
如果设置为true,则调用下面的一个:
protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
事实证明,无论您设置什么,始终会调用返回IsValid
的{{1}}方法。
为了爱上帝,这个ValidationResult
属性是什么?
答案 0 :(得分:5)
RequiresValidationContext对于CompareAttribute或自定义属性验证器非常有用。
ValidationAttribute是抽象类,它取决于你的意思。例如,我有Validation Attribute,只有当另一个属性有一些值时才检查是否需要某些字段。
如果调用了IsValid(对象值),它依赖于Attribute实现。例如:
[Display(Name = "Your employer")]
[LoginTypeRequired(LoginType = LoginType.Employee, ErrorMessage = "Employee must fill in Employer.")]
public int? Employer { get; set; }
属性代码:
public class LoginTypeRequiredAttribute : RequiredAttribute
{
public override bool RequiresValidationContext
{
get {return true;}
}
public LoginType LoginType { get; set; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
RegisterModel model = (RegisterModel)validationContext.ObjectInstance;
if (LoginType != model.LoginType)
return null;
else
return base.IsValid(value, validationContext);
}
public override bool IsValid(object value)
{
return base.IsValid(value);
}
}
第一个带有两个参数的方法使用IsValid(对象值,ValidationContext validationContext)来完成上下文的工作。如果一切正常,它会调用基础并且内部.NET 4.5堆栈是:
LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(对象 值)92行C# System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(对象 value,System.ComponentModel.DataAnnotations.ValidationContext validationContext)+ 0x74字节
LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(对象 value,System.ComponentModel.DataAnnotations.ValidationContext validationContext)第87行+ 0xe字节C# System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(对象 value,System.ComponentModel.DataAnnotations.ValidationContext validationContext)+ 0x1e个字节
System.Web.Mvc.dll程序!System.Web.Mvc.DataAnnotationsModelValidator.Validate.MoveNext() + 0xa2 bytes System.Web.Mvc.dll!System.Web.Mvc.ModelValidator.CompositeModelValidator.Validate.MoveNext() + 0x138 bytes System.Web.Mvc.dll!System.Web.Mvc.DefaultModelBinder.OnModelUpdated(System.Web.Mvc.ControllerContext controllerContext,System.Web.Mvc.ModelBindingContext bindingContext) + 0x212字节
因此,您可以看到,如果不覆盖,则IsValid(对象值,ValidationContext validationContext)正在调用IsValid(对象值)。
但是你仍然有机会覆盖IsValid(对象值,ValidationContext validationContext)而不是调用基础。
答案 1 :(得分:0)
如果我没记错的话,如果调用Validate(Object, String)重载而不是Validate(Object, ValidationContext),则会抛出ValidationException。