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
- Convalida con Data Annotations
- Regole di FluentValidation
- Regole personalizzate e condizionali
- Integrazione della convalida con le API