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
- Walidacja za pomocą adnotacji danych
- Reguły FluentValidation
- Reguły niestandardowe i warunkowe
- Integracja walidacji z API