0Pricing
C# Academy · Lekcja

Reguły niestandardowe i warunkowe

Twórz złożoną, warunkową logikę walidacji.

Reguły niestandardowe i warunkowe to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Poza wbudowanymi walidatorami

Walidacja w rzeczywistych aplikacjach często wymaga niestandardowej logiki: wartości przechodzącej sprawdzenie domenowe albo reguły obowiązującej tylko w określonych warunkach. FluentValidation obsługuje oba przypadki za pomocą Must, When i niestandardowych typów walidatorów.

Predykat Must

Must przyjmuje predykat, który zwraca true, gdy wartość jest poprawna. To najprostszy sposób na wyrażenie dowolnej logiki bezpośrednio w regule.

RuleFor(c => c.Username)
    .Must(name => !name.Contains(" "))
    .WithMessage("Username cannot contain spaces.");

Must z dostępem do całego obiektu

Jeden z przeciążeń Must udostępnia obiekt nadrzędny oraz wartość właściwości, umożliwiając sprawdzanie zależności między właściwościami.

RuleFor(o => o.DiscountedPrice)
    .Must((order, discounted) => discounted <= order.OriginalPrice)
    .WithMessage("Discounted price cannot exceed original price.");

Reguły warunkowe za pomocą When

When stosuje regułę tylko wtedy, gdy warunek jest spełniony. W tym przypadku adres wysyłki jest wymagany wyłącznie dla zamówień produktów fizycznych.

RuleFor(o => o.ShippingAddress)
    .NotEmpty()
    .When(o => o.RequiresShipping);

Modyfikator Unless

Unless jest przeciwieństwem When: reguła jest uruchamiana, chyba że warunek jest prawdziwy.

RuleFor(o => o.CouponCode)
    .NotEmpty()
    .Unless(o => o.IsGift);

Grupowanie warunków

Kilka reguł można umieścić w jednym bloku When(...), aby w czytelny sposób współdzielić warunek między wszystkimi regułami.

When(o => o.RequiresShipping, () =>
{
    RuleFor(o => o.ShippingAddress).NotEmpty();
    RuleFor(o => o.PostalCode).NotEmpty();
});

Asynchroniczna logika niestandardowa za pomocą MustAsync

Gdy sprawdzenie wymaga dostępu do bazy danych lub API, należy użyć MustAsync. Model należy walidować za pomocą ValidateAsync.

RuleFor(u => u.Email)
    .MustAsync(async (email, cancellation) =>
        !await _repository.EmailExistsAsync(email))
    .WithMessage("Email is already registered.");

Pisanie wielokrotnego użytku walidatora niestandardowego

W przypadku logiki wykorzystywanej w wielu projektach należy napisać metodę rozszerzającą dla IRuleBuilder. Dzięki temu niestandardowe reguły stają się pełnoprawnymi walidatorami, które można łączyć w łańcuchy.

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.");
    }
}

Używanie walidatora niestandardowego

Po zdefiniowaniu rozszerzenie można łączyć tak jak każdy wbudowany walidator, zachowując ekspresyjność walidatorów.

RuleFor(p => p.Slug).NotEmpty().ValidSlug();

Niestandardowa metoda zapewniająca pełną kontrolę

W przypadku złożonych wyników Custom umożliwia imperatywne dodawanie błędów walidacji za pomocą kontekstu.

RuleFor(o => o.Items).Custom((items, context) =>
{
    if (items.Count == 0)
        context.AddFailure("An order must contain at least one item.");
});

Tryby kaskadowania

Domyślnie wszystkie walidatory w łańcuchu są uruchamiane nawet po wystąpieniu błędu. Ustawienie CascadeMode.Stop zatrzymuje wykonywanie przy pierwszym błędzie, co pozwala uniknąć zbędnych lub niebezpiecznych sprawdzeń.

RuleFor(c => c.Email)
    .Cascade(CascadeMode.Stop)
    .NotEmpty()
    .EmailAddress();

Szybkie sprawdzenie

Sprawdź reguły warunkowe i niestandardowe.

Podsumowanie

Reguły niestandardowe i warunkowe zwiększają elastyczność FluentValidation: Must służy do predykatów definiowanych bezpośrednio w regule (z przeciążeniem udostępniającym cały obiekt), When/Unless do warunków, bloki When do grupowania reguł, MustAsync do sprawdzeń wymagających operacji wejścia/wyjścia, rozszerzenia IRuleBuilder do ponownego używania logiki, imperatywna metoda Custom do złożonych przypadków, a tryby Cascade do kontrolowania przebiegu sprawdzania.

Często zadawane pytania

Czy lekcja „Reguły niestandardowe i warunkowe” jest bezpłatna?

Tak — pełny tekst „Reguły niestandardowe i warunkowe” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Reguły niestandardowe i warunkowe”?

Twórz złożoną, warunkową logikę walidacji. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Reguły niestandardowe i warunkowe”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Walidacja za pomocą adnotacji danych
  2. Reguły FluentValidation
  3. Reguły niestandardowe i warunkowe
  4. Integracja walidacji z API
← Powrót do C# Academy