Asp.net ValidationAttribute类的RequiresValidationContext属性是什么?
在.NET Framework 4.5中,该类现在有一个新的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);
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)
?