Come sappiamo, il motore di ASP.NET MVC sfrutta le data annotation con le quali possiamo marcare il nostro modello, al fine di automatizzare alcune funzionalità, quali la visualizzazione della proprietà, la validazione e il binding. Tra le data annotation più utilizzate, certamente le più comuni sono l'attributo Required o StringLength che permettono rispettivamente di rendere obbligatoria una proprietà o limitarne la dimensione. Questi e gli altri attributi dispongono di molteplici proprietà e comune ad esse ci sono il messaggio di errore localizzato o non.
Spesso questi attributi sono molto ripetitivi nella loro definizione, specialmente per quanto riguarda i messaggi di errore. Nello script di oggi proponiamo la creazione di un ModelValidatorProvider, oggetto che ha il compito di restituire i validatori per una proprietà. L'implementazione predefinita è il DataAnnotationsModelValidatorProvider, che appunto fa uso degli attributi per ottenere queste informazioni. Possiamo però svilupparne uno nostro, affinché valorizziamo tutti gli attributi con messaggi standard, senza doverlo fare ad ogni utilizzo. Questa è la classe che prima di chiamare l'implementazione standard, prende gli attributi e li cambia.
public class MyModelValidatorProvider : DataAnnotationsModelValidatorProvider { protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes) { // Per tutti imposto questa etichetta foreach (var a in attributes.OfType<RequiredAttribute>().Where(a => String.IsNullOrEmpty(a.ErrorMessage))) a.ErrorMessage = "Il campo '{0}' è obbligatorio"; foreach (var a in attributes.OfType<StringLengthAttribute>()) a.ErrorMessage = "Il campo '{0}' può avere avere una lunghezza da {2} a {1} caratteri"; foreach (var a in attributes.OfType<MaxLengthAttribute>()) a.ErrorMessage = "Il campo '{0}' può avere avere una lunghezza massima di {1} caratteri"; foreach (var a in attributes.OfType<RangeAttribute>()) a.ErrorMessage = "Il campo '{0}' deve avere un valore compreso tra {1} e {2}"; return base.GetValidators(metadata, context, attributes); } }
Fatto questo non ci resta che registrare il nostro validatore, solitamente allo start dell'applicazione.
// Rimuovo il provider predefinito ModelValidatorProviders.Providers.Clear(); ModelValidatorProviders.Providers.Add(new MyModelValidatorProvider());
A questo punto nei nostri modelli è sufficiente marcare con l'attributo senza preoccuparci dei messaggi, i quali normalmente sono inglese, perché verranno automaticamente impostati in italiano.
public class MyModel { [Required] [StringLength(50)] public string Field1 { get; set;} }
Valorizzare il messaggio di errore è solo una delle tante possibilità. Eventualmente possiamo prima ottenere i ModelValidator dal metodo base e lavorare su di essi, se necessario.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione
Miglioramenti nelle performance di Angular 16
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Utilizzare la funzione EF.Parameter per forzare la parametrizzazione di una costante con Entity Framework
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Generare la software bill of material (SBOM) in GitHub
Eseguire i worklow di GitHub su runner potenziati
Generare velocemente pagine CRUD in Blazor con QuickGrid
Creare una libreria CSS universale: Cards
Path addizionali per gli asset in ASP.NET Core MVC
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary