2009-11-23 29 views
5

nếu có nhiều kinh nghiệm sử dụng [C#] FluentValidation và có bất kỳ ý tưởng nào cho câu hỏi dưới đây, bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.Xác nhận 2 danh sách sử dụng FluentValidation

Tôi có 2 Danh sách chung (cả với kiểu dữ liệu chuỗi) - "Tên" và "Url". Cả hai đều có cùng số lượng mục, do đó các mục được lập chỉ mục phù hợp với tên, [0] tương quan với Url [0].

Vấn đề duy nhất tôi gặp phải là xác thực các mục trống trong mỗi danh sách. Các quy tắc tôi cần là:

nếu một mục rỗng trong Tên [2] thì Url [2] không được để trống. nếu một mục trống trong Url [2] thì Tên [2] không được để trống. nếu cả hai đều trống rỗng thì chúng tôi không muốn xác thực, chúng tôi muốn bỏ qua.

lưu ý: Tôi đã sử dụng chỉ số 2 trong ví dụ trên nhưng nó có thể là bất cứ điều gì

Cho đến nay tôi có:

RuleFor(f => f.Names).Must(d => d.All(s => !String.IsNullOrEmpty(s))) 
       .WithMessage("Names cannot be empty.") 

RuleFor(f => f.URLs).Must(urls => urls.All(s => !String.IsNullOrEmpty(s))) 
       .WithMessage("URLs cannot be empty.") 

này kiểm tra mà không có mục nào là có sản phẩm nào trong cả hai danh sách, tuy nhiên tôi cần để có thể không xác nhận các mục để trống trong một danh sách nếu mục tương quan trong mục khác cũng trống (Nếu cả hai đều trống thì chúng ta chỉ muốn bỏ qua nó).

Bất kỳ ý tưởng nào?

Trả lời

8

tôi đã kết thúc sử dụng mã FluentValidation sau để kiểm tra các mục corrosponding trong mỗi danh sách, lớn nhờ Guvante như nó đã được lấy cảm hứng từ Pseudo-code của mình :)

RuleFor(f => f.Names).Must((f, d) => 
      { 
       for (int i = 0; i < d.Count; i++) 
       { 
        if ((String.IsNullOrEmpty(d[i]) && 
         !String.IsNullOrEmpty(f.URLs[i]))) 
         return false; 
       } 

       return true; 
      }) 
      .WithMessage("Names cannot be empty."); 

      RuleFor(f => f.URLs).Must((f, u) => 
      { 
       for (int i = 0; i < u.Count; i++) 
       { 
        if ((String.IsNullOrEmpty(u[i]) && 
         !String.IsNullOrEmpty(f.Names[i]))) 
         return false; 
       } 

       return true; 
      }) 
      .WithMessage("URLs cannot be empty."); 
+1

Cảm ơn bạn rất nhiều vì đã đăng bài này. Tôi đã kéo tóc ra. Điều này làm việc tuyệt vời nếu bạn đang xác nhận rằng ít nhất là trên hộp kiểm đã được kiểm tra: 'RuleFor (x => x.AvailableCompanies) .Must ((f, d) => {return d.Find (h => h.Checked == true)! = null;}). WithMessage ("Vui lòng chọn ít nhất một công ty"); ' – brenjt

1

Đây là một số mã giả của giải pháp bạo lực. (Tôi không thể nghĩ ra bất kỳ cách nào của LINQ để thực hiện các so sánh được lập chỉ mục) Xin lỗi vì đã khai báo cú pháp Fluent.

Must(Names.Length == URLs.Length).WithMessage("Names must be equal in size to URLs"); 
for (int i = 0; i < Name.Length; i++) 
{ 
    Must(string.IsNullOrEmpty(Names[i]) ^^ string.IsNullOrEmpty(URLs[i])).WithMessage("Either Name and URL must be non-empty, or both must be empty, index = " + i); 
} 

Hy vọng bạn có được ý chính của nó, bạn cũng có thể muốn xem xét các phương pháp LINQ chung, có khả năng tôi đã bỏ lỡ. Về cơ bản bạn đang muốn làm một tham gia, và sau đó kiểm tra kết quả không hợp lệ trong danh sách hợp nhất, nhưng một lần nữa tôi không chắc chắn làm thế nào để làm một hàng bằng hàng và không chỉ đơn giản là một nhiều để tham gia nhiều.

+0

@Guvante: Cảm ơn, pseudo- của bạn mã nhận bóng lăn đúng hướng (xem câu trả lời đã đăng). +1 cho bạn :) – Scozzard

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