0Pricing
C# Academy · Lección

Reglas personalizadas y condicionales

Construya lógica de validación compleja y condicional.

Reglas personalizadas y condicionales es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Más allá de los validadores integrados

La validación en aplicaciones reales suele necesitar lógica personalizada: un valor que debe superar una comprobación de dominio o una regla que solo se aplica en determinadas condiciones. FluentValidation admite ambos casos con Must, When y tipos de validadores personalizados.

El predicado Must

Must recibe un predicado que devuelve true cuando el valor es válido. Es la forma más sencilla de expresar lógica arbitraria en línea.

RuleFor(c => c.Username)
    .Must(name => !name.Contains(" "))
    .WithMessage("Username cannot contain spaces.");

Must con acceso al objeto completo

Una sobrecarga de Must le proporciona el objeto principal junto con el valor de la propiedad, lo que permite realizar comprobaciones entre propiedades.

RuleFor(o => o.DiscountedPrice)
    .Must((order, discounted) => discounted <= order.OriginalPrice)
    .WithMessage("Discounted price cannot exceed original price.");

Reglas condicionales con When

When aplica una regla solo si se cumple una condición. En este caso, la dirección de envío solo es obligatoria para los pedidos físicos.

RuleFor(o => o.ShippingAddress)
    .NotEmpty()
    .When(o => o.RequiresShipping);

El modificador Unless

Unless es el inverso de When: la regla se ejecuta a menos que la condición sea verdadera.

RuleFor(o => o.CouponCode)
    .NotEmpty()
    .Unless(o => o.IsGift);

Agrupación de condiciones

Incluya varias reglas en un único bloque When(...) para compartir una condición de forma clara entre todas ellas.

When(o => o.RequiresShipping, () =>
{
    RuleFor(o => o.ShippingAddress).NotEmpty();
    RuleFor(o => o.PostalCode).NotEmpty();
});

Lógica personalizada asíncrona con MustAsync

Cuando la comprobación necesita acceder a la base de datos o a una API, use MustAsync. Valide el modelo con ValidateAsync.

RuleFor(u => u.Email)
    .MustAsync(async (email, cancellation) =>
        !await _repository.EmailExistsAsync(email))
    .WithMessage("Email is already registered.");

Escritura de un validador personalizado reutilizable

Para la lógica que reutiliza en varios proyectos, escriba un método de extensión para IRuleBuilder. Así convertirá las reglas personalizadas en validadores encadenables de primera clase.

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.");
    }
}

Uso del validador personalizado

Una vez definido, la extensión se encadena como cualquier validador integrado, lo que mantiene la expresividad de sus validadores.

RuleFor(p => p.Slug).NotEmpty().ValidSlug();

El método Custom para obtener un control total

Para resultados complejos, Custom permite añadir errores de validación de forma imperativa mediante un contexto.

RuleFor(o => o.Items).Custom((items, context) =>
{
    if (items.Count == 0)
        context.AddFailure("An order must contain at least one item.");
});

Modos de Cascade

De forma predeterminada, todos los validadores de una cadena se ejecutan incluso después de que uno falle. Establezca CascadeMode.Stop para detenerse ante el primer error y evitar comprobaciones redundantes o inseguras.

RuleFor(c => c.Email)
    .Cascade(CascadeMode.Stop)
    .NotEmpty()
    .EmailAddress();

Comprobación rápida

Compruebe las reglas condicionales y personalizadas.

Resumen

Las reglas personalizadas y condicionales hacen que FluentValidation sea flexible: Must para predicados en línea (con una sobrecarga que expone el objeto completo), When/Unless para condiciones, bloques When agrupados, MustAsync para comprobaciones de E/S, extensiones reutilizables de IRuleBuilder, el método imperativo Custom y los modos de Cascade para controlar el flujo de evaluación.

Preguntas frecuentes

¿La lección «Reglas personalizadas y condicionales» es gratis?

Sí — el texto completo de «Reglas personalizadas y condicionales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Reglas personalizadas y condicionales»?

Construya lógica de validación compleja y condicional. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Reglas personalizadas y condicionales»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Validación con Data Annotations
  2. Reglas de FluentValidation
  3. Reglas personalizadas y condicionales
  4. Integración de la validación con las API
← Volver a C# Academy