2012-09-25 32 views
3

使用.NET Framework 4.5,ValidationAttribute類現在有一個新的Boolean屬性,名稱爲RequiresValidationContext什麼是ValidationAttribute類的RequiresValidationContext屬性?

我一直在挖掘很長一段時間,我無法找到這個屬性是在那裏。這樣做的difault值是假的,我最初認爲,如果設置爲false,下面的方法被稱爲:

public virtual bool IsValid(object value) 

如果它被設置爲true,那麼下面的一個被稱爲:

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

事實證明,無論您設置什麼,總是調用返回ValidationResultIsValid方法。

對於上帝的愛,這是什麼RequiresValidationContext屬性?

回答

4

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)而不是調用基礎。

+1

非常聰明!但是我必須注意,即使'RequiresValidationContext'和'IsValid(object)'沒有被覆蓋,你的方法也能工作。 – UserControl

+0

爲什麼重寫'IsValid(object value)'除了調用基本實現之外什麼都沒有? – Faust