Условная проверка с использованием плавной проверки

86

Мне нужен способ условной проверки полей в зависимости от того, заполнены ли другие поля.

Ex. У меня есть раскрывающийся список и поле даты, которые связаны. Если ни одно из полей не задано, форма должна пройти проверку. Однако, если одно из двух полей установлено, а другое - нет, тогда должна сработать проверка, требующая установки другого поля.

Я написал собственные классы проверки, но кажется, что он проверяет отдельные поля. Есть ли способ настроить нужную мне проверку с помощью встроенных валидаторов? Если нет, есть ли хороший способ связать два поля с помощью настраиваемого валидатора?

Шик Компьютерщик
источник

Ответы:

129

Плавная проверка поддерживает условную проверку, просто используйте предложение When, чтобы проверить значение вторичного поля:

https://fluentvalidation.net/start#conditions

Определение условия с помощью методов When / Unless . Методы When и Unless могут использоваться для указания условий, которые определяют, когда должно выполняться правило. Например, это правило свойства CustomerDiscount будет выполняться, только если IsPreferredCustomer имеет значение true:

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

Метод Unless - это просто противоположность метода When.

Вы также можете использовать операцию .SetValidator для определения настраиваемого валидатора, который работает с условием NotEmpty.

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

Если вам нужно указать одно и то же условие для нескольких правил, вы можете вызвать метод верхнего уровня When вместо связывания вызова When в конце правила:

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

На этот раз условие будет применяться к обоим правилам. Вы также можете связать вызов с Иначе, который вызовет правила, не соответствующие условию:

When(customer => customer.IsPreferred, () => {
   RuleFor(customer => customer.CustomerDiscount).GreaterThan(0);
   RuleFor(customer => customer.CreditCardNumber).NotNull();
}).Otherwise(() => {
  RuleFor(customer => customer.CustomerDiscount).Equal(0);
});
Денис Питчер
источник