2011-12-17 45 views
9

Tôi đang cố gắng xác thực các đối tượng lồng nhau (không phải mô hình trong cảm giác MVC) bằng cách sử dụng chú thích và một số mã tùy chỉnh.Xác thực đệ quy bằng cách sử dụng chú thích và IValidatableObject

Tôi tìm thấy bài sau đây hữu ích

Using Data Annotations Validation Manually and Object Graphs

Như đã đề cập trong một câu trả lời, tôi đã tạo ra một thói quen bổ sung trong lớp container để xác nhận đối tượng lồng nhau. Dưới đây là mã kiểm tra sửa đổi của tôi

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

    [Required] 
    [MaxLength(2)] 
    public string Name 
    { 
     get; 
     set; 
    } 

    public CustomerDetails Details 
    { 
     get; 
     private set; 
    } 

    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; 
    } 
} 

Tuy nhiên tôi có vấn đề về nhận tất cả các lỗi xác nhận, ngay cả khi gọi TryValidateObject với validateAllProperties thiết lập là true.

 var context = new ValidationContext(cs, null, null); 
     var results = new List<ValidationResult>(); 
     Validator.TryValidateObject(cs, context, results,true); 

Nếu có bất kỳ lỗi nào trong vùng chứa, chỉ những lỗi này sẽ hiển thị. Chỉ khi không có lỗi trong đối tượng chứa, các lỗi trong đối tượng lồng nhau sẽ hiển thị. Tôi nghi ngờ nó có cái gì để làm với các xác nhận rouine trở về một danh sách đầy đủ, và không thể thêm vào một (hiện có) danh sách từ container (?)

Có bất kỳ sửa đổi tôi có thể làm cho thói quen để có được tất cả lỗi hiển thị?

Trả lời

5

Xem câu trả lời này: https://stackoverflow.com/a/3400627/724944

Vì vậy, có một lỗi trong lớp atributes của bạn, và do đó phương pháp Validate không được gọi. tôi đề nghị sử dụng CustomValidationAttribute như thế này:

[CustomValidation(typeof(Customer), "ValidateRelatedObject")] 
public CustomerDetails Details 
{ 
    get; 
    private set; 
} 

public static ValidationResult ValidateRelatedObject(object value, ValidationContext context) 
{ 
    var context = new ValidationContext(value, validationContext.ServiceContainer, validationContext.Items); 
    var results = new List<ValidationResult>(); 
    Validator.TryValidateObject(value, context, results); 

    // TODO: Wrap or parse multiple ValidationResult's into one ValidationResult 

    return result; 

} 
+0

Ok, nếu tôi hiểu bạn một cách chính xác, "validateAllProperties" sẽ chỉ ảnh hưởng đến các thuộc tính chú thích, không phải là một thói quen Validate riêng biệt? Nhưng tôi đã cố gắng thực hiện thói quen của bạn, nhưng tôi có vấn đề với những gì bạn để lại như TODO. Khi ValidateRelatedObject trả về một ValidationResult duy nhất, (đối với một thuộc tính chú thích đơn), làm thế nào tôi có thể đẩy nó vào danh sách các lỗi tiềm ẩn (từ đối tượng lồng nhau) vào danh sách các lỗi tiềm ẩn từ các đối tượng vùng chứa? Ví dụ ban đầu dường như hứa hẹn hơn trong lĩnh vực này khi nó trả về một danh sách. Sự giúp đỡ của bạn được đánh giá rất cao! – goorj

+0

Trong dự án của tôi, tôi chỉ đơn giản liệt kê tất cả các lỗi ValidationResult và Merge thành một chuỗi, được phân cách bằng dòng mới. Sau đó, khi tôi cần sử dụng nó, tôi chỉ cần chia lỗi thành nhiều dòng. Bạn cũng có thể cân nhắc việc tạo một lớp như MultiValidationResult để lưu trữ xác thực của ValidationResult và hiển thị lỗi nối. – surfen

Các vấn đề liên quan