Datenvalidierung in C# (.NET): Vollständiger Leitfaden
Datenvalidierung ist einer der wichtigsten Aspekte bei der Entwicklung zuverlässiger und sicherer Anwendungen in C#. Sie stellt sicher, dass Eingabedaten dem erwarteten Format, Wertebereichen und Geschäftsregeln entsprechen. Im .NET-Ökosystem gibt es mehrere leistungsstarke Werkzeuge zur Validierung: von den integrierten Attributen System.ComponentModel.DataAnnotations bis zur flexiblen Bibliothek FluentValidation. In diesem Artikel werden wir beide Ansätze mit Codebeispielen im Detail behandeln.
1. Integrierte Validierung mit DataAnnotations
Der Namespace System.ComponentModel.DataAnnotations bietet eine Reihe von Attributen, die auf Eigenschaften von Modellklassen angewendet werden können. Dies ist die einfachste und schnellste Methode zur Validierung, insbesondere in ASP.NET Core MVC und Blazor.
Wichtige Attribute:
[Required]— Der Wert darf nichtnulloder leer sein.[StringLength(max)]— Begrenzung der Zeichenkettenlänge.[Range(min, max)]— Prüfung von Zahlenbereichen.[RegularExpression(pattern)]— Prüfung mit regulärem Ausdruck.[EmailAddress]— E-Mail-Validierung.[Compare("OtherProperty")]— Vergleich zweier Eigenschaften (z. B. Passwort und Bestätigung).
Beispielmodell mit Attributen:
public class UserRegistrationDto{ [Required(ErrorMessage = "Name ist erforderlich")] [StringLength(50, MinimumLength = 2, ErrorMessage = "Der Name muss zwischen 2 und 50 Zeichen lang sein")] public string FirstName { get; set; }
[Required(ErrorMessage = "E-Mail ist erforderlich")] [EmailAddress(ErrorMessage = "Ungültiges E-Mail-Format")] public string Email { get; set; }
[Required] [Range(18, 120, ErrorMessage = "Das Alter muss zwischen 18 und 120 liegen")] public int Age { get; set; }
[Required] [DataType(DataType.Password)] public string Password { get; set; }
[Compare("Password", ErrorMessage = "Passwörter stimmen nicht überein")] public string ConfirmPassword { get; set; }}Manuelle Modellprüfung:
public static bool ValidateUser(UserRegistrationDto user, out List<ValidationResult> errors){ var context = new ValidationContext(user); errors = new List<ValidationResult>(); return Validator.TryValidateObject(user, context, errors, validateAllProperties: true);}
// Verwendung:var user = new UserRegistrationDto { FirstName = "A", Email = "invalid", Age = 15 };if (!ValidateUser(user, out var errors)){ foreach (var error in errors) Console.WriteLine(error.ErrorMessage);}2. FluentValidation — Erweiterte Validierung
Die Bibliothek FluentValidation (NuGet: FluentValidation.AspNetCore) bietet eine flexiblere und lesbarere Möglichkeit, Validierungsregeln über eine Fluent-Schnittstelle zu beschreiben. Sie eignet sich ideal für komplexe Szenarien: bedingte Validierung, benutzerdefinierte Nachrichten, Regelketten und Integration mit DI-Containern.
Installation über NuGet:
dotnet add package FluentValidation.AspNetCoreBeispielvalidator:
using FluentValidation;
public class UserValidator : AbstractValidator<UserRegistrationDto>{ public UserValidator() { RuleFor(u => u.FirstName) .NotEmpty().WithMessage("Der Name darf nicht leer sein") .Length(2, 50).WithMessage("Der Name muss zwischen 2 und 50 Zeichen lang sein");
RuleFor(u => u.Email) .NotEmpty().WithMessage("E-Mail ist erforderlich") .EmailAddress().WithMessage("Ungültiges E-Mail-Format");
RuleFor(u => u.Age) .InclusiveBetween(18, 120).WithMessage("Das Alter muss zwischen