2011-08-04 64 views
3

讓我們假設我有兩個簡單的類:使用數據註釋驗證手動和對象圖

public class CustomerDetails 
{ 
    [Required] 
    public string Address 
    { 
    get; 
    set; 
    } 
} 

public class Customer 
{ 
    public Customer() 
    { 
    Details = new CustomerDetails(); 
    } 

    [Required] 
    public string Name 
    { 
    get; 
    set; 
    } 
    public CustomerDetails Details 
    { 
    get; 
    private set; 
    } 
} 

當我嘗試手動驗證在這樣一個控制檯應用程序Customer類:

var customer = new Customer() { Name = "Conrad" }; 
var context = new ValidationContext(customer, null, null); 
var results = new List<ValidationResult>(); 
Validator.TryValidateObject(customer, context, true); 

然後 - 儘管我選擇驗證客戶實例的所有屬性 - Validator只是驗證客戶實例的Name屬性,而不驗證Details的Address屬性。

這是設計還是我在這裏錯過了什麼?此外,如果這是通過設計,那麼是否有一種可靠的方法來手動驗證用驗證屬性裝飾的完整對象圖,包括嵌套類型而不是手動使用整個對象圖的驗證器?

請注意,這是在控制檯應用程序內而不是ASP.NET MVC應用程序中測試的。

親切的問候。

回答

1

我幾乎有同樣的問題,但與嵌套對象的集合。我能夠通過在容器類上實現IValidatableObject來解決它。在你的情況下,它更容易。這樣的事情:

public class Customer : IValidatableObject 
{ 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items); 
     var results = new List<ValidationResult>(); 
     Validator.TryValidateObject(this.Details, context, results); 
     return results; 
    } 
} 

希望這會有所幫助。

+0

這只是一個遞歸級別,必須手動手工製作。有沒有什麼方法可以自動遍歷整個對象圖,而不需要自定義的'Validate'實現? – gzak