Validación condicional mediante Fluent Validation

86

Lo que necesito es una forma de validar condicionalmente los campos dependiendo de si se completan otros campos.

Ex. Tengo un menú desplegable y un campo de fecha que están relacionados. Si no se establece ninguno de los campos, el formulario debe pasar la validación. Sin embargo, si uno de los dos campos está configurado pero el otro no, entonces la validación debería dispararse, requiriendo que se configure el otro campo.

He escrito clases de validación personalizadas, pero parece que se valida en campos individuales. ¿Hay alguna forma de configurar la validación que necesito usando los validadores integrados? Si no es así, ¿existe una buena manera de conectar dos campos usando un validador personalizado?

El Sheek Geek
fuente

Respuestas:

129

La validación fluida admite la validación condicional, solo use la cláusula When para verificar el valor del campo secundario:

https://fluentvalidation.net/start#conditions

Especificar una condición con los métodos When / Unless The When y Unless se pueden usar para especificar condiciones que controlan cuándo debe ejecutarse la regla. Por ejemplo, esta regla en la propiedad CustomerDiscount solo se ejecutará cuando IsPreferredCustomer sea verdadera:

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

El método Unless es simplemente lo opuesto a When.

También puede utilizar la operación .SetValidator para definir un validador personalizado que opere en la condición NotEmpty.

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

Si necesita especificar la misma condición para varias reglas, puede llamar al método When de nivel superior en lugar de encadenar la llamada When al final de la regla:

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

Esta vez, la condición se aplicará a ambas reglas. También puede encadenar una llamada a otra cosa que invocará reglas que no coincidan con la condición:

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