6

在 .NET Framework 4.5 中,ValidationAttribute该类现在有一个Boolean名为RequiresValidationContext.

我已经挖了很长时间了,我找不到这个属性是为了什么。这个的默认值是假的,我最初认为如果这个设置为假,下面的方法会被调用:

public virtual bool IsValid(object value)

如果设置为 true,则调用以下函数:

protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);

事实证明,无论你设置什么,总是调用IsValid返回的方法。ValidationResult

看在上帝的份上,这个RequiresValidationContext财产有什么用?

4

2 回答 2

6

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 value) Line 92 C# System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext) + 0x74字节

LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext) Line 87 + 0xe bytes C# System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(object value , 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 controllerContext, System.Web.Mvc.ModelBindingContext bindingContext) + 0x212 字节

因此,您可以看到 IsValid(object value, ValidationContext validationContext) 的 case 正在调用 IsValid(object value) 如果没有覆盖。

但是您仍然有机会覆盖 IsValid(object value, ValidationContext validationContext) 而不是调用基础。

于 2013-11-10T17:41:12.270 回答
0

如果我没记错的话,如果调用Validate(Object, String)重载而不是Validate(Object, ValidationContext),它会抛出ValidationException

于 2012-09-25T15:39:43.850 回答