2014-07-22 54 views
0

我正在嘗試使用數據註釋進行自定義驗證。 試圖讓屬性,我都遵循這樣一個問題: How to create Custom Data Annotation Validators未驗證自定義數據註釋屬性

我的屬性看起來像這樣

internal class ExcludeDefaultAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     return false; 
    } 
} 

和驗證被稱爲:

internal static class TypeValidator 
{ 
    static public bool Validate(object item) 
    { 
     List<ValidationResult> results = new List<ValidationResult>(); 
     ValidationContext context = new ValidationContext(item); 
     if (Validator.TryValidateObject(item, context, results)) 
     { 
      return true; 
     } 
     else 
     { 
      string message = string.Format("Error validating item"); 
      throw new TypeInvalidException(results, message); 
     } 
    } 
} 

所以,這裏是問題。目前,我的自定義驗證應始終返回false。所以驗證應該總是失敗。但是,每當我嘗試驗證在字段上具有此屬性的對象時,它都會通過驗證,這表明我的自定義驗證屬性未被評估。我不想在驗證中做出任何實際的邏輯,直到我知道它實際上正在運行。 我錯過了什麼嗎?我的所有研究都表示我只需要從ValidationAttribute繼承,但它不起作用。

回答

1

根據該MSDN article,所述TryValidateObject方法將執行以下操作:

此方法評價爲附着到的對象類型的每個ValidationAttribute實例。它還檢查是否提供了每個標有RequiredAttribute的屬性。它不遞歸驗證對象的屬性值。

我測試了這一點,它的行爲與使用所提供的語法進行廣告相同。

編輯

每下面的評論中,使用的所有屬性,包括那些使用自定義的正確驗證以下過載效果屬性:

TryValidateObject(object instance, ValidationContext validationContext, ICollection<ValidationResult> validationResults, bool validateAllProperties) 
+0

文檔說,它評估每個ValidationAttribute,所以不應該它正在檢查我的自定義嗎?當它表示它沒有遞歸驗證時,我將它表示賦予給屬性的對象未經驗證。 –

+1

想通了。 TryValidateObject有一個可選的第四個參數。如果設置爲true,則會對所有屬性(包括我的自定義屬性)進行驗證。 –