2014-02-22 21 views
2

當這些對象位於簡單對象上時,我可以驗證Data Annotation和IValidatableObject。但是,在對象具有必須驗證的屬性的情況下,事情會發生錯誤。一次爲DataAnnotation和IValidatableObject顯示所有驗證錯誤

public class BaseClass 
{ 
    public IEnumerable<ValidationResult> Validate() 
    { 
     var results = new List<ValidationResult>(); 
     var validationContext = new ValidationContext(this, null, null); 
     Validator.TryValidateObject(this, validationContext, results, true); 
     return results; 
    } 
} 

public class Class1 : BaseClass, IValidatableObject 
{ 
    public Class1() 
    { 
     Property1 = new Class2(); 
    } 
    public Class2 Property1 { get; set; } 
    //[Required] 
    public string AString1 { get; set; } 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var e = new ValidationResult("Error from class1"); 
     var s = Property1.Validate(); 
     var r = new List<ValidationResult>(s) { e }; 
     return r; 
    } 
} 

public class Class2 :BaseClass, IValidatableObject 
{ 
    public Class2() 
    { 
     Property2 = new Class3(); 
    } 
    public Class3 Property2 { get; set; } 
    //[Required] 
    public string AString2 { get; set; } 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     yield return new ValidationResult("Error from class2"); 
    } 
} 

public class Class3:BaseClass 
{ 
    //[Required] 
    public string AString3 { get; set; } 
} 
[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var s = new Class1(); 
     var results = s.Validate(); 
     Assert.AreEqual(5, results.Count()); 
    } 
} 

這個小代碼片段返回2個錯誤。這兩個來自IValidatableObject的Validate方法。這可以。但是,如果我取消註釋三個「必需」數據註釋,我應該有5個錯誤(2個來自Validate方法,3個來自Data Annotation)。

爲什麼當我取消註釋三個數據註釋,我只有一個錯誤「需要AString1字段。」這是第一類數據註釋?

我怎樣才能返回五個錯誤?

+0

相關,http://stackoverflow.com/questions/3400542/how-do-i-use-ivalidatableobject/3400627 – user960567

回答

0

我相信這是因爲DataAnotations.Validator.GetObjectValidationErrors中的代碼在第一個屬性錯誤後啓動,將其餘驗證規則短路。您可以通過在Validate()方法中進行所有驗證來解決此問題。

+0

是的,我明白,但DataAnnotation是快速可用性和有驗證客戶端有趣。我想知道如果他們是一種方法,使其正常工作。 –