加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – ValidationAttribute类的RequiresValidationContext

发布时间:2020-12-16 06:25:31 所属栏目:asp.Net 来源:网络整理
导读:在.NET Framework 4.5中, ValidationAttribute 类现在有一个名为 RequiresValidationContext 的新布尔属性. 我一直在挖掘很长时间,我找不到这个属性的用途.这个的difault值是false,我最初认为如果将其设置为false,则调用以下方法: public virtual bool IsVa
在.NET Framework 4.5中,ValidationAttribute类现在有一个名为 RequiresValidationContext的新布尔属性.

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

public virtual bool IsValid(object value)

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

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

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

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

解决方法

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

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
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 bytes

因此,您可以看到案例IsValid(对象值,ValidationContext validationContext)如果不覆盖则调用IsValid(对象值).

但是你仍然有机会覆盖IsValid(对象值,ValidationContext validationContext)而不是调用基数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读