Benutzerdefinierte und bedingte Regeln
Erstellen Sie komplexe, bedingte Validierungslogik.
Benutzerdefinierte und bedingte Regeln ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Über integrierte Validatoren hinaus
Bei der Validierung in realen Anwendungen wird häufig benutzerdefinierte Logik benötigt: etwa wenn ein Wert eine Domänenprüfung bestehen oder eine Regel nur unter bestimmten Bedingungen gelten soll. FluentValidation unterstützt beides mit Must, When und benutzerdefinierten Validatortypen.
Das Must-Prädikat
Must übernimmt ein Prädikat, das true zurückgibt, wenn der Wert gültig ist. Das ist die einfachste Möglichkeit, beliebige Logik direkt auszudrücken.
RuleFor(c => c.Username)
.Must(name => !name.Contains(" "))
.WithMessage("Username cannot contain spaces.");Must mit Zugriff auf das gesamte Objekt
Eine Überladung von Must stellt Ihnen neben dem Eigenschaftswert auch das übergeordnete Objekt bereit und ermöglicht dadurch Prüfungen über mehrere Eigenschaften hinweg.
RuleFor(o => o.DiscountedPrice)
.Must((order, discounted) => discounted <= order.OriginalPrice)
.WithMessage("Discounted price cannot exceed original price.");Bedingte Regeln mit When
When wendet eine Regel nur an, wenn eine Bedingung erfüllt ist. In diesem Fall ist eine Lieferadresse nur für physische Bestellungen erforderlich.
RuleFor(o => o.ShippingAddress)
.NotEmpty()
.When(o => o.RequiresShipping);Der Unless-Modifikator
Unless ist das Gegenteil von When: Die Regel wird ausgeführt, solange die Bedingung nicht wahr ist.
RuleFor(o => o.CouponCode)
.NotEmpty()
.Unless(o => o.IsGift);Bedingungen gruppieren
Schließen Sie mehrere Regeln in einen einzigen When(...)-Block ein, um eine Bedingung übersichtlich für alle Regeln gemeinsam zu verwenden.
When(o => o.RequiresShipping, () =>
{
RuleFor(o => o.ShippingAddress).NotEmpty();
RuleFor(o => o.PostalCode).NotEmpty();
});Asynchrone benutzerdefinierte Logik mit MustAsync
Wenn Ihre Prüfung die Datenbank oder eine API benötigt, verwenden Sie MustAsync. Validieren Sie das Modell mit ValidateAsync.
RuleFor(u => u.Email)
.MustAsync(async (email, cancellation) =>
!await _repository.EmailExistsAsync(email))
.WithMessage("Email is already registered.");Einen wiederverwendbaren benutzerdefinierten Validator schreiben
Für Logik, die Sie projektübergreifend wiederverwenden, schreiben Sie eine Erweiterungsmethode für IRuleBuilder. Dadurch werden benutzerdefinierte Regeln zu vollwertigen, verkettbaren Validatoren.
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.");
}
}Den benutzerdefinierten Validator verwenden
Nach der Definition lässt sich die Erweiterung wie jeder integrierte Validator verketten, sodass Ihre Validatoren ausdrucksstark bleiben.
RuleFor(p => p.Slug).NotEmpty().ValidSlug();Die Custom-Methode für vollständige Kontrolle
Für komplexe Ergebnisse können Sie mit Custom über einen Kontext Validierungsfehler imperativ hinzufügen.
RuleFor(o => o.Items).Custom((items, context) =>
{
if (items.Count == 0)
context.AddFailure("An order must contain at least one item.");
});Kaskadenmodi
Standardmäßig werden alle Validatoren einer Kette auch dann ausgeführt, wenn einer zuvor fehlschlägt. Setzen Sie CascadeMode.Stop, um beim ersten Fehler abzubrechen und redundante oder unsichere Prüfungen zu vermeiden.
RuleFor(c => c.Email)
.Cascade(CascadeMode.Stop)
.NotEmpty()
.EmailAddress();Kurzer Check
Testen Sie bedingte und benutzerdefinierte Regeln.
Zusammenfassung
Benutzerdefinierte und bedingte Regeln machen FluentValidation flexibel: Must für Inline-Prädikate (mit einer Überladung, die das gesamte Objekt bereitstellt), When/Unless für Bedingungen, gruppierte When-Blöcke, MustAsync für E/A-Prüfungen, wiederverwendbare IRuleBuilder-Erweiterungen, die imperative Custom-Methode und Cascade-Modi zur Steuerung des Auswertungsablaufs.
Häufig gestellte Fragen
Ist die Lektion „Benutzerdefinierte und bedingte Regeln“ kostenlos?
Ja — der vollständige Text von „Benutzerdefinierte und bedingte Regeln“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Benutzerdefinierte und bedingte Regeln“?
Erstellen Sie komplexe, bedingte Validierungslogik. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Benutzerdefinierte und bedingte Regeln“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Validierung mit Data Annotations
- FluentValidation-Regeln
- Benutzerdefinierte und bedingte Regeln
- Validierung in APIs integrieren