ValidationAttribute类的RequiresValidationContext属性是什么?

时间:2012-09-25 14:35:08

标签: asp.net .net validation data-annotations .net-4.5

使用.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属性是什么?

2 个答案:

答案 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

相关问题