Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net ValidationAttribute类的RequiresValidationContext属性是什么?_Asp.net_.net_Validation_Data Annotations_.net 4.5 - Fatal编程技术网

Asp.net ValidationAttribute类的RequiresValidationContext属性是什么?

Asp.net ValidationAttribute类的RequiresValidationContext属性是什么?,asp.net,.net,validation,data-annotations,.net-4.5,Asp.net,.net,Validation,Data Annotations,.net 4.5,在.NET Framework 4.5中,该类现在有一个新的Boolean属性,名为 我已经挖了很长时间了,我找不到这片土地的用途。该函数的difault值为false,我最初认为,如果将其设置为false,则调用以下方法: public virtual bool IsValid(object value) protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);

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

我已经挖了很长时间了,我找不到这片土地的用途。该函数的difault值为false,我最初认为,如果将其设置为false,则调用以下方法:

public virtual bool IsValid(object value)
protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
如果设置为true,则调用以下选项:

public virtual bool IsValid(object value)
protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
结果表明,无论您设置了什么,
IsValid
方法返回的
ValidationResult
总是被调用的


看在上帝的份上,这个
RequiresValidationContext
属性是什么?

如果我没记错的话,如果重载不是被调用的,它会抛出一个。

RequiresValidationContext对于类似CompareAttribute或custom属性的验证器很有用

ValidationAttribute是抽象类,它取决于您所指的实现。例如,我有一个Validation属性,它检查只有当另一个属性具有某些值时,某些字段才是必需的

是否调用IsValid(对象值)取决于属性实现。例如:

[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)来处理上下文。如果一切正常,则调用base,内部.NET 4.5堆栈为:

LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(对象 值)第92行C# System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid(对象 值,System.ComponentModel.DataAnnotations.ValidationContext validationContext)+0x74字节

LinqDataModel.dll!LinqDataModel.Models.LoginTypeRequiredAttribute.IsValid(对象 值,System.ComponentModel.DataAnnotations.ValidationContext validationContext)第87行+0xe字节C# System.ComponentModel.DataAnnotations.dll!System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(对象 值,System.ComponentModel.DataAnnotations.ValidationContext 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) +0x212字节

因此,您可以看到案例IsValid(对象值,ValidationContext ValidationContext)在调用IsValid(对象值),如果不重写的话


但您仍然有机会重写IsValid(对象值、ValidationContext ValidationContext),而不调用基。

非常聪明!但是我必须注意,即使
requiresvalidatecontext
IsValid(object)
未被重写,您的方法也可以工作。为什么只需调用基本实现就可以重写
IsValid(object value)