0Pricing
C# Academy · Lezione

Regole personalizzate e condizionali

Costruisca una logica di convalida complessa e condizionale.

Regole personalizzate e condizionali è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Oltre i validatori integrati

La convalida nel mondo reale richiede spesso una logica personalizzata: un valore che deve superare un controllo di dominio o una regola applicabile solo in determinate condizioni. FluentValidation supporta entrambi i casi con Must, When e tipi di validatore personalizzati.

Il predicato Must

Must accetta un predicato che restituisce true quando il valore è valido. È il modo più semplice per esprimere una logica arbitraria inline.

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

Must con accesso all'intero oggetto

Un overload di Must fornisce l'oggetto padre insieme al valore della proprietà, consentendo controlli tra proprietà diverse.

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

Regole condizionali con When

When applica una regola solo se una condizione è soddisfatta. In questo caso, un indirizzo di spedizione è obbligatorio solo per gli ordini fisici.

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

Il modificatore Unless

Unless è l'inverso di When: la regola viene eseguita a meno che la condizione non sia vera.

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

Raggruppamento delle condizioni

Racchiuda diverse regole in un unico blocco When(...) per condividere in modo chiaro una condizione tra tutte.

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

Logica personalizzata asincrona con MustAsync

Quando il controllo richiede il database o un'API, usi MustAsync. Convalidi il modello con ValidateAsync.

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

Scrittura di un validatore personalizzato riutilizzabile

Per la logica riutilizzata in più progetti, scriva un metodo di estensione per IRuleBuilder. In questo modo le regole personalizzate diventano validatori di prima classe e concatenabili.

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

Utilizzo del validatore personalizzato

Una volta definita, l'estensione si concatena come qualsiasi validatore integrato, mantenendo espressivi i validatori.

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

Il metodo Custom per il controllo completo

Per risultati complessi, Custom consente di aggiungere imperativamente errori di convalida utilizzando un contesto.

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

Modalità Cascade

Per impostazione predefinita, tutti i validatori di una catena vengono eseguiti anche dopo un errore. Imposti CascadeMode.Stop per arrestare l'esecuzione al primo errore, evitando controlli ridondanti o non sicuri.

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

Verifica rapida

Verifichi le regole condizionali e personalizzate.

Riepilogo

Le regole personalizzate e condizionali rendono FluentValidation flessibile: Must per i predicati inline, con un overload che espone l'intero oggetto; When/Unless per le condizioni; blocchi When raggruppati; MustAsync per i controlli che richiedono I/O; estensioni riutilizzabili di IRuleBuilder; il metodo imperativo Custom; e le modalità Cascade per controllare il flusso di valutazione.

Domande Frequenti

La lezione «Regole personalizzate e condizionali» è gratuita?

Sì — il testo completo di «Regole personalizzate e condizionali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Regole personalizzate e condizionali»?

Costruisca una logica di convalida complessa e condizionale. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Regole personalizzate e condizionali»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Convalida con Data Annotations
  2. Regole di FluentValidation
  3. Regole personalizzate e condizionali
  4. Integrazione della convalida con le API
← Torna a C# Academy