Validación de datos en C# (.NET): guía completa con ejemplos
La validación de datos es uno de los aspectos clave en el desarrollo de aplicaciones robustas en C# dentro del ecosistema .NET. Garantiza que los datos entrantes cumplan con las reglas establecidas, previniendo errores, vulnerabilidades y estados incorrectos del sistema. En este artículo, analizaremos en detalle las principales bibliotecas y herramientas para la validación en .NET, incluyendo mecanismos integrados y soluciones de terceros populares.
¿Por qué es importante la validación de datos?
Sin validación, la aplicación puede recibir:
- Tipos de datos incorrectos (por ejemplo, una cadena en lugar de un número).
- Valores fuera de los rangos permitidos (edad negativa, correo electrónico inexistente).
- Inyecciones SQL, ataques XSS y otras amenazas de seguridad.
- Violaciones de la lógica de negocio (pedido sin productos, nombre de usuario vacío).
El uso de enfoques estructurados para la validación hace que el código sea más limpio, comprobable y seguro.
1. Validación integrada: Data Annotations (System.ComponentModel.DataAnnotations)
La forma más simple y común es usar atributos del espacio de nombres System.ComponentModel.DataAnnotations. Este método es ideal para modelos en ASP.NET Core MVC, Web API y Entity Framework.
Ejemplo de modelo con atributos:
using System.ComponentModel.DataAnnotations;
public class User{ [Required(ErrorMessage = "El nombre es obligatorio")] [StringLength(50, MinimumLength = 2, ErrorMessage = "El nombre debe tener entre 2 y 50 caracteres")] public string Name { get; set; }
[Required] [EmailAddress(ErrorMessage = "Correo electrónico no válido")] public string Email { get; set; }
[Range(1, 120, ErrorMessage = "La edad debe estar entre 1 y 120")] public int Age { get; set; }
[Phone(ErrorMessage = "Número de teléfono no válido")] public string Phone { get; set; }}Validación programática del modelo:
var user = new User { Name = "A", Email = "invalid", Age = 200 };var context = new ValidationContext(user);var results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(user, context, results, true);
if (!isValid){ foreach (var error in results) { Console.WriteLine(error.ErrorMessage); }}Ventajas: simplicidad, soporte integrado en ASP.NET Core, validación automática a nivel de controladores.
Desventajas: flexibilidad limitada, los atributos están fuertemente acoplados al modelo, difícil implementar reglas de negocio complejas.
2. FluentValidation — validación flexible y expresiva
La biblioteca FluentValidation es la herramienta de terceros más popular para la validación en .NET. Permite separar las reglas de validación en clases independientes, admite encadenamiento de llamadas, mensajes personalizados y condiciones complejas.
Instalación mediante NuGet: Install-Package FluentValidation
Ejemplo de validador:
using FluentValidation;
public class UserValidator : AbstractValidator<User>{ public UserValidator() { RuleFor(u => u.Name) .NotEmpty().WithMessage("El nombre no puede estar vacío") .Length(2, 50).WithMessage("La longitud del nombre debe ser entre 2 y 50 caracteres");
RuleFor(u => u.Email) .NotEmpty() .EmailAddress().WithMessage("Formato de correo electrónico no válido");
RuleFor(u => u.Age) .InclusiveBetween(1, 120).WithMessage("Edad fuera del rango");
// Regla personalizada RuleFor(u => u.Phone) .Matches(@"^\\+?[1-9]\\d{1,14}$").When(u => !string.IsNullOrEmpty(u.Phone)) .WithMessage("Número de teléfono en formato internacional"); }}Uso