Validación de datos en C# (.NET): guía completa
La validación de datos es uno de los aspectos clave en el desarrollo de aplicaciones robustas y seguras en C#. Permite garantizar que los datos de entrada cumplan con el formato esperado, rangos de valores y reglas de negocio. En el ecosistema .NET existen varias herramientas potentes para la validación: desde los atributos integrados System.ComponentModel.DataAnnotations hasta la flexible biblioteca FluentValidation. En este artículo analizaremos en detalle ambos enfoques con ejemplos de código.
1. Validación integrada mediante DataAnnotations
El espacio de nombres System.ComponentModel.DataAnnotations proporciona un conjunto de atributos que se pueden aplicar a las propiedades de las clases modelo. Esta es la forma más sencilla y rápida de validación, especialmente en ASP.NET Core MVC y Blazor.
Atributos principales:
[Required]— el valor no puede sernullo vacío.[StringLength(max)]— limitación de longitud de cadena.[Range(min, max)]— verificación de rangos numéricos.[RegularExpression(pattern)]— verificación mediante expresión regular.[EmailAddress]— validación de correo electrónico.[Compare("OtherProperty")]— comparación de dos propiedades (por ejemplo, contraseña y confirmación).
Ejemplo de modelo con atributos:
public class UserRegistrationDto{ [Required(ErrorMessage = "El nombre es obligatorio")] [StringLength(50, MinimumLength = 2, ErrorMessage = "El nombre debe contener entre 2 y 50 caracteres")] public string FirstName { get; set; }
[Required(ErrorMessage = "El email es obligatorio")] [EmailAddress(ErrorMessage = "Formato de email no válido")] public string Email { get; set; }
[Required] [Range(18, 120, ErrorMessage = "La edad debe estar entre 18 y 120")] public int Age { get; set; }
[Required] [DataType(DataType.Password)] public string Password { get; set; }
[Compare("Password", ErrorMessage = "Las contraseñas no coinciden")] public string ConfirmPassword { get; set; }}Verificación manual del modelo:
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);}
// Uso: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 — validación avanzada
La biblioteca FluentValidation (NuGet: FluentValidation.AspNetCore) ofrece una forma más flexible y legible de describir reglas de validación mediante una interfaz fluida. Es ideal para escenarios complejos: validación condicional, mensajes personalizados, cadenas de reglas e integración con contenedores DI.
Instalación mediante NuGet:
dotnet add package FluentValidation.AspNetCoreEjemplo de validador:
using FluentValidation;
public class UserValidator : AbstractValidator<UserRegistrationDto>{ public UserValidator() { RuleFor(u => u.FirstName) .NotEmpty().WithMessage("El nombre no puede estar vacío") .Length(2, 50).WithMessage("El nombre debe contener entre 2 y 50 caracteres");
RuleFor(u => u.Email) .NotEmpty().WithMessage("El email es obligatorio") .EmailAddress().WithMessage("Formato de email no válido");
RuleFor(u => u.Age) .InclusiveBetween(18, 120).WithMessage("La edad debe estar entre También en la biblioteca
Generación de informes PDF en Go: revisión de bibliotecas y ejemplos de código
Serialización de objetos en Java: guía completa para principiantes
Registro en Rust: revisión de las mejores bibliotecas y soluciones para tu proyecto
Geolocalización y mapas en Swift para iOS/macOS: guía completa