Bedingte Validierung mit Fluent Validation

86

Was ich brauche, ist eine Möglichkeit, Felder bedingt zu validieren, je nachdem, ob andere Felder ausgefüllt sind.

Ex. Ich habe ein Dropdown- und ein Datumsfeld, die zusammenhängen. Wenn keines der Felder festgelegt ist, sollte das Formular die Validierung bestehen. Wenn jedoch eines der beiden Felder festgelegt ist, das andere jedoch nicht, sollte die Validierung ausgelöst werden, sodass das andere Feld festgelegt werden muss.

Ich habe benutzerdefinierte Validierungsklassen geschrieben, aber es scheint, dass sie in einzelnen Feldern validiert werden. Gibt es eine Möglichkeit, die Validierung, die ich benötige, mithilfe der integrierten Validatoren einzurichten? Wenn nicht, gibt es eine gute Möglichkeit, zwei Felder mit einem benutzerdefinierten Validator zu verbinden?

Der Sheek Geek
quelle

Antworten:

128

Die fließende Validierung unterstützt die bedingte Validierung. Verwenden Sie einfach die When-Klausel, um den Wert des sekundären Felds zu überprüfen:

https://fluentvalidation.net/start#conditions

Angeben einer Bedingung mit Wann / Es sei denn, Mit den Methoden Wann und Es können Bedingungen angegeben werden, die steuern, wann die Regel ausgeführt werden soll. Diese Regel für die CustomerDiscount-Eigenschaft wird beispielsweise nur ausgeführt, wenn IsPreferredCustomer true ist:

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

Die Es sei denn, die Methode ist einfach das Gegenteil von Wann.

Möglicherweise können Sie auch die Operation .SetValidator verwenden, um einen benutzerdefinierten Validator zu definieren, der unter der NotEmpty-Bedingung ausgeführt wird.

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

Wenn Sie dieselbe Bedingung für mehrere Regeln angeben müssen, können Sie die When-Methode der obersten Ebene aufrufen, anstatt den When-Aufruf am Ende der Regel zu verketten:

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

Dieses Mal wird die Bedingung auf beide Regeln angewendet. Sie können auch einen Aufruf an Andernfalls verketten, wodurch Regeln aufgerufen werden, die nicht der Bedingung entsprechen:

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