Validação condicional usando validação fluente

86

O que eu preciso é de uma forma de validar condicionalmente os campos, dependendo se outros campos estão preenchidos.

Ex. Eu tenho uma lista suspensa e um campo de data que estão relacionados. Se nenhum dos campos for definido, o formulário deve passar na validação. No entanto, se um dos dois campos for definido, mas o outro não, a validação deve ser acionada, exigindo que o outro campo seja definido.

Eu escrevi classes de validação personalizadas, mas parece que valida em campos únicos. Existe uma maneira de configurar a validação de que preciso usando os validadores integrados? Caso contrário, existe uma boa maneira de conectar dois campos usando um validador personalizado?

The Sheek Geek
fonte

Respostas:

129

A validação fluente oferece suporte à validação condicional, basta usar a cláusula When para verificar o valor do campo secundário:

https://fluentvalidation.net/start#conditions

Especificando uma condição com Quando / A menos Os métodos Quando e A menos podem ser usados ​​para especificar as condições que controlam quando a regra deve ser executada. Por exemplo, esta regra na propriedade CustomerDiscount só será executada quando IsPreferredCustomer for verdadeiro:

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

O método A menos é simplesmente o oposto de Quando.

Você também pode usar a operação .SetValidator para definir um validador personalizado que opera na condição NotEmpty.

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

Se você precisar especificar a mesma condição para várias regras, poderá chamar o método When de nível superior em vez de encadear a chamada When no final da regra:

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

Desta vez, a condição será aplicada a ambas as regras. Você também pode encadear uma chamada para Caso contrário, que invocará regras que não correspondem à condição:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
Denis Pitcher
fonte