Validación de datos en C# (.NET): bibliotecas, atributos y FluentValidation

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 ser null o 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.AspNetCore


Ejemplo 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

Recommendations