【问题标题】:What is the RequiresValidationContext property of ValidationAttribute class for?ValidationAttribute 类的 RequiresValidationContext 属性有什么用?
【发布时间】:2012-09-25 14:35:08
【问题描述】:

在 .NET Framework 4.5 中,ValidationAttribute 类现在有一个名为 RequiresValidationContext 的新 Boolean 属性。

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

public virtual bool IsValid(object value)

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

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

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

看在上帝的份上,RequiresValidationContext 属性是干什么用的?

【问题讨论】:

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


    【解决方案1】:

    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) 而不是调用基数。

    【讨论】:

    • 非常聪明!但我必须注意,即使 RequiresValidationContextIsValid(object) 未被覆盖,您的方法也有效。
    • 为什么只调用基本实现就覆盖IsValid(object value)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2021-12-26
      • 1970-01-01
      相关资源
      最近更新 更多