Xác thực có điều kiện bằng Xác thực thông thạo


86

Những gì tôi cần là một cách để xác nhận có điều kiện các trường tùy thuộc vào việc các trường khác có được điền hay không.

Ví dụ. Tôi có một danh sách thả xuống và một trường ngày có liên quan. Nếu không có trường nào được đặt thì biểu mẫu sẽ vượt qua xác thực. Tuy nhiên, nếu một trong hai trường được đặt nhưng trường còn lại thì không thì quá trình xác thực sẽ kích hoạt, yêu cầu trường còn lại được đặt.

Tôi đã viết các lớp xác thực tùy chỉnh nhưng có vẻ như nó được xác thực trên các trường đơn lẻ. Có cách nào để thiết lập xác thực mà tôi cần bằng cách sử dụng trình xác thực có sẵn không? Nếu không, Có cách nào tốt để kết nối hai trường bằng trình xác thực tùy chỉnh không?

Câu trả lời:


130

Xác thực thông thạo hỗ trợ xác thực có điều kiện, chỉ cần sử dụng mệnh đề Khi để kiểm tra giá trị của trường phụ:

https://fluentvalidation.net/start#conditions

Chỉ định một điều kiện với Khi / Trừ khi Các phương thức Khi và Trừ khi có thể được sử dụng để chỉ định các điều kiện kiểm soát thời điểm quy tắc sẽ thực thi. Ví dụ: quy tắc này trên thuộc tính CustomerDiscount sẽ chỉ thực thi khi IsPreferredCustomer là true:

RuleFor(customer => customer.CustomerDiscount)
    .GreaterThan(0)
    .When(customer => customer.IsPreferredCustomer);

Phương thức Unless đơn giản là ngược lại với When.

Bạn cũng có thể sử dụng thao tác .SetValidator để xác định trình xác thực tùy chỉnh hoạt động trên điều kiện NotEmpty.

RuleFor(customer => customer.CustomerDiscount)
    .GreaterThan(0)
    .SetValidator(New MyCustomerDiscountValidator);

Nếu bạn cần chỉ định cùng một điều kiện cho nhiều quy tắc thì bạn có thể gọi phương thức Khi cấp cao nhất thay vì nối chuỗi lệnh gọi Khi ở cuối quy tắc:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
});

Lần này, điều kiện sẽ được áp dụng cho cả hai quy tắc. Bạn cũng có thể chuỗi một lệnh gọi tới Nếu không sẽ gọi các quy tắc không phù hợp với điều kiện:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.