Пользовательские и условные правила
Создавайте сложную условную логику проверки.
«Пользовательские и условные правила» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
За пределами встроенных валидаторов
В реальных приложениях часто требуется пользовательская логика: например, проверка значения по доменным правилам или правило, действующее только при определённых условиях. FluentValidation поддерживает оба случая с помощью Must, When и пользовательских типов валидаторов.
Предикат Must
Must принимает предикат, который возвращает true, если значение корректно. Это самый простой способ выразить произвольную логику непосредственно в правиле.
RuleFor(c => c.Username)
.Must(name => !name.Contains(" "))
.WithMessage("Username cannot contain spaces.");Must с доступом ко всему объекту
Одна из перегрузок Must предоставляет родительский объект и значение свойства, что позволяет проверять зависимости между несколькими свойствами.
RuleFor(o => o.DiscountedPrice)
.Must((order, discounted) => discounted <= order.OriginalPrice)
.WithMessage("Discounted price cannot exceed original price.");Условные правила с помощью When
When применяет правило только при выполнении условия. В данном случае адрес доставки требуется только для физических заказов.
RuleFor(o => o.ShippingAddress)
.NotEmpty()
.When(o => o.RequiresShipping);Модификатор Unless
Unless — противоположность When: правило выполняется, если условие не истинно.
RuleFor(o => o.CouponCode)
.NotEmpty()
.Unless(o => o.IsGift);Группировка условий
Оберните несколько правил в единый блок When(...), чтобы аккуратно применить к ним одно общее условие.
When(o => o.RequiresShipping, () =>
{
RuleFor(o => o.ShippingAddress).NotEmpty();
RuleFor(o => o.PostalCode).NotEmpty();
});Асинхронная пользовательская логика с MustAsync
Если для проверки требуется обращение к базе данных или API, используйте MustAsync. Проверяйте модель с помощью ValidateAsync.
RuleFor(u => u.Email)
.MustAsync(async (email, cancellation) =>
!await _repository.EmailExistsAsync(email))
.WithMessage("Email is already registered.");Создание повторно используемого пользовательского валидатора
Для логики, которую нужно повторно использовать в разных проектах, напишите метод расширения для IRuleBuilder. Так пользовательские правила превращаются в полноценные валидаторы, поддерживающие цепочки вызовов.
public static class CustomValidators
{
public static IRuleBuilderOptions<T, string> ValidSlug<T>(
this IRuleBuilder<T, string> rule)
{
return rule.Matches("^[a-z0-9-]+$")
.WithMessage("Must be a lowercase slug.");
}
}Использование пользовательского валидатора
После определения расширение объединяется в цепочку так же, как любой встроенный валидатор, благодаря чему правила остаются выразительными.
RuleFor(p => p.Slug).NotEmpty().ValidSlug();Пользовательский метод для полного контроля
Для сложных результатов Custom позволяет императивно добавлять ошибки проверки с помощью контекста.
RuleFor(o => o.Items).Custom((items, context) =>
{
if (items.Count == 0)
context.AddFailure("An order must contain at least one item.");
});Режимы Cascade
По умолчанию все валидаторы в цепочке выполняются, даже если один из них завершился ошибкой. Установите CascadeMode.Stop, чтобы остановиться на первой ошибке и избежать избыточных или небезопасных проверок.
RuleFor(c => c.Email)
.Cascade(CascadeMode.Stop)
.NotEmpty()
.EmailAddress();Быстрая проверка
Проверьте условные и пользовательские правила.
Итоги
Пользовательские и условные правила делают FluentValidation гибким: Must — для предикатов, заданных непосредственно в правиле (в одной из перегрузок доступен весь объект), When/Unless — для условий, сгруппированные блоки When, MustAsync — для проверок с вводом-выводом, расширения IRuleBuilder — для повторного использования, императивный метод Custom, а режимы Cascade — для управления последовательностью проверки.
Часто задаваемые вопросы
Урок «Пользовательские и условные правила» бесплатный?
Да — полный текст урока «Пользовательские и условные правила» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Пользовательские и условные правила»?
Создавайте сложную условную логику проверки. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Пользовательские и условные правила»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проверка с помощью аннотаций данных
- Правила FluentValidation
- Пользовательские и условные правила
- Интеграция проверки с API