Умовна перевірка за допомогою перевірки вільного потоку


86

Мені потрібен спосіб умовної перевірки полів залежно від заповнення інших полів.

Напр. У мене є спадне меню та поле дати, які пов’язані. Якщо жодне з полів не встановлено, форма повинна пройти перевірку. Однак, якщо одне з двох полів встановлено, а інше - ні, тоді перевірка повинна запускатися, що вимагає встановлення іншого поля.

Я написав власні класи перевірки, але здається, що це перевіряється на окремих полях. Чи є спосіб налаштувати перевірку, яка мені потрібна, за допомогою вбудованих валідаторів? Якщо ні, чи є хороший спосіб зв’язати два поля за допомогою спеціального валідатора?

Відповіді:


129

Перевірка вільної роботи підтримує умовну перевірку, просто використовуйте речення When, щоб перевірити значення вторинного поля:

https://fluentvalidation.net/start#conditions

Вказівка ​​умови за допомогою методів When / Unless Методи When and Unless можна використовувати для вказівки умов, які контролюють час виконання правила. Наприклад, це правило щодо властивості CustomerDiscount буде виконуватися лише тоді, коли IsPreferredCustomer відповідає істині:

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

Метод "Хіба що" просто протилежний "Коли".

Ви також можете скористатися операцією .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);
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.