Convalida condizionale utilizzando Fluent Validation


86

Quello di cui ho bisogno è un modo per convalidare in modo condizionale i campi a seconda che altri campi siano compilati.

Ex. Ho un menu a discesa e un campo data correlati. Se nessuno dei campi è impostato, il modulo dovrebbe superare la convalida. Tuttavia, se uno dei due campi è impostato ma l'altro non lo è, la convalida dovrebbe essere attivata, richiedendo l'impostazione dell'altro campo.

Ho scritto classi di convalida personalizzate ma sembra che sia convalidato su singoli campi. C'è un modo per impostare la convalida di cui ho bisogno utilizzando i validatori incorporati? In caso contrario, esiste un buon modo per collegare due campi utilizzando un validatore personalizzato?

Risposte:


131

La convalida fluida supporta la convalida condizionale, basta usare la clausola When per controllare il valore del campo secondario:

https://fluentvalidation.net/start#conditions

Specificare una condizione con When / Unless I metodi When e Unless possono essere utilizzati per specificare le condizioni che controllano quando la regola deve essere eseguita. Ad esempio, questa regola sulla proprietà CustomerDiscount verrà eseguita solo quando IsPreferredCustomer è true:

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

Il metodo Unless è semplicemente l'opposto di When.

Potresti anche essere in grado di utilizzare l'operazione .SetValidator per definire un validatore personalizzato che opera sulla condizione NotEmpty.

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

Se è necessario specificare la stessa condizione per più regole, è possibile chiamare il metodo When di primo livello invece di concatenare la chiamata When alla fine della regola:

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

Questa volta, la condizione verrà applicata a entrambe le regole. Puoi anche concatenare una chiamata ad Altrimenti che richiamerà regole che non corrispondono alla condizione:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.