gpt4 book ai didi

asp.net - ValidationAttribute 类的 RequiresValidationContext 属性有什么用?

转载 作者:行者123 更新时间:2023-12-02 02:46:00 28 4
gpt4 key购买 nike

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

我已经挖了很长时间了,但找不到这个属性的用途。它的默认值为 false,我最初认为如果将其设置为 false,则会调用以下方法:

public virtual bool IsValid(object value)

如果它设置为 true,则调用以下函数:

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

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

老天爷啊,这个 RequiresValidationContext 属性有什么用?

最佳答案

RequiresValidationContext 对于像 CompareAttribute 或自定义属性这样的验证器很有用。

ValidationAttribute 是抽象类,它取决于您的意思是什么实现。例如,我有验证属性,仅当另一个属性具有某些值时才检查某些字段是否是必需的。

IsValid(object value)是否被调用取决于属性的实现。例如:

[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 validContext) 来完成上下文的工作。如果一切正常,它将调用基础,内部 .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(object value, ValidationContext validationContext) 正在调用 IsValid(object value)。

但是您仍然有机会重写 IsValid(object value, ValidationContext validContext) 并且不调用基类。

关于asp.net - ValidationAttribute 类的 RequiresValidationContext 属性有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12585267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com