Walidacja warunkowa przy użyciu Fluent Validation


86

Potrzebuję sposobu warunkowego sprawdzania poprawności pól w zależności od tego, czy inne pola są wypełnione.

Dawny. Mam listę rozwijaną i pole daty, które są powiązane. Jeśli żadne z pól nie jest ustawione, formularz powinien przejść walidację. Jeśli jednak jedno z dwóch pól jest ustawione, a drugie nie, weryfikacja powinna zostać uruchomiona, wymagając ustawienia drugiego pola.

Napisałem własne klasy walidacyjne, ale wygląda na to, że sprawdza się na pojedynczych polach. Czy istnieje sposób na skonfigurowanie walidacji, której potrzebuję, przy użyciu wbudowanych walidatorów? Jeśli nie, czy istnieje dobry sposób na połączenie dwóch pól za pomocą niestandardowego walidatora?

Odpowiedzi:


129

Fluent validation obsługuje walidację warunkową, po prostu użyj klauzuli When, aby sprawdzić wartość pola dodatkowego:

https://fluentvalidation.net/start#conditions

Określanie warunku za pomocą When / Unless Metody When i Unless mogą służyć do określania warunków określających, kiedy reguła ma być wykonywana. Na przykład ta reguła dotycząca właściwości CustomerDiscount będzie wykonywana tylko wtedy, gdy wartość IsPreferredCustomer jest prawdziwe:

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

Metoda Unless jest po prostu przeciwieństwem When.

Możesz także użyć operacji .SetValidator do zdefiniowania niestandardowego walidatora, który działa na warunku NotEmpty.

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

Jeśli chcesz określić ten sam warunek dla wielu reguł, możesz wywołać metodę When najwyższego poziomu zamiast łączyć wywołanie When na końcu reguły:

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

Tym razem warunek zostanie zastosowany do obu reguł. Możesz również połączyć wywołanie Otherwise, co spowoduje wywołanie reguł, które nie spełniają warunku:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.