ValidationAttribute类的RequiresValidationContext属性是什么?

tug*_*erk 5 .net asp.net validation data-annotations .net-4.5

使用.NET Framework 4.5,ValidationAttribute该类现在具有一个Boolean名为的新属性RequiresValidationContext.

我一直在挖掘很长时间,我找不到这个属性的用途.这个的difault值是false,我最初认为如果将其设置为false,则调用以下方法:

public virtual bool IsValid(object value)
Run Code Online (Sandbox Code Playgroud)

如果设置为true,则调用下面的一个:

protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
Run Code Online (Sandbox Code Playgroud)

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

为了爱上帝,这个RequiresValidationContext属性是什么?

Tom*_*bes 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; }
Run Code Online (Sandbox Code Playgroud)

属性代码:

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);
        }
}
Run Code Online (Sandbox Code Playgroud)

第一个带有两个参数的方法使用IsValid(对象值,ValidationContext validationContext)来完成上下文的工作.如果一切正常,它会调用基础并且内部.NET 4.5堆栈是:

LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(object value)第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)第87行+ 0xe字节C#System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(object value ,System.ComponentModel.DataAnnotations.ValidationContext validationContext)+ 0x1e bytes
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)而不是调用基数.