RequiresValidationContext對於像CompareAttribute或自定義屬性這樣的驗證器很有用。
ValidationAttribute是抽象類,它取決於你的意思。例如,我有驗證屬性,用於檢查某些字段是否僅在其他屬性具有某個值時才需要。
如果調用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(對象 值),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 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字節
所以,你可以看到,該案的IsValid(對象的值,ValidationContext validationContext)是調用的IsValid(Object value)如果不覆蓋。
但是你仍然有機會重寫IsValid(object value,ValidationContext validationContext)而不是調用基礎。
非常聰明!但是我必須注意,即使'RequiresValidationContext'和'IsValid(object)'沒有被覆蓋,你的方法也能工作。 – UserControl
爲什麼重寫'IsValid(object value)'除了調用基本實現之外什麼都沒有? – Faust