0Pricing
C# Academy · Урок

Пользовательские и условные правила

Создавайте сложную условную логику проверки.

«Пользовательские и условные правила» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Проверка с помощью аннотаций данных
  2. Правила FluentValidation
  3. Пользовательские и условные правила
  4. Интеграция проверки с API
← Назад к C# Academy