RequiresValidationContext 对于CompareAttribute 或自定义属性等验证器很有用。
ValidationAttribute 是抽象类,它取决于你的意思是什么实现。例如,我有验证属性,仅当另一个属性具有某些值时才检查某些字段是否是必需的。
是否调用 IsValid(object value) 取决于 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(object value, ValidationContext validationContext) 来处理上下文。如果一切正常,它调用基础和内部 .NET 4.5 堆栈是:
LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(object
值)第 92 行 C#
System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(对象
值,System.ComponentModel.DataAnnotations.ValidationContext
验证上下文)+ 0x74 字节
LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(object
值,System.ComponentModel.DataAnnotations.ValidationContext
validationContext) 第 87 行 + 0xe 字节 C#
System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(对象
值,System.ComponentModel.DataAnnotations.ValidationContext
验证上下文)+ 0x1e 字节
System.Web.Mvc.dll!System.Web.Mvc.DataAnnotationsModelValidator.Validate.MoveNext()
+ 0xa2 字节 System.Web.Mvc.dll!System.Web.Mvc.ModelValidator.CompositeModelValidator.Validate.MoveNext()
+ 0x138 字节 System.Web.Mvc.dll!System.Web.Mvc.DefaultModelBinder.OnModelUpdated(System.Web.Mvc.ControllerContext
控制器上下文,System.Web.Mvc.ModelBindingContext 绑定上下文)
+ 0x212 字节
因此,您可以看到 IsValid(object value, ValidationContext validationContext) 的 case 如果未覆盖,则调用 IsValid(object value)。
但您仍然有机会覆盖 IsValid(object value, ValidationContext validationContext) 而不是调用基数。