Con ASP.NET MVC 3 l'infrastruttura di validazione è stata resa veramente completa. Già nel precedente script abbiamo mostrato la novità della RemoteValidation, tramite cui validare l'input sul client effettuando una chiamata AJAX verso il server.
Quando le regole di business diventano complesse, magari coinvolgendo contemporaneamente più proprietà, esprimerle tramite attributi può risultare poco pratico. In simili contesti, risulta invece molto utile avvalersi dell'interfaccia IValidatableObject, anch'essa parte dell'infrastruttura delle DataAnnotation, tramite cui possiamo specificare la logica di validazione direttamente all'interno del model.
Immaginiamo ad esempio di avere una classe come quella seguente, che rappresenta un'intervallo di date:
public class DateInterval : IValidatableObject { [Required] public DateTime StartDate { get; set; } [Required] public DateTime EndDate { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { // logica di validazione } }
Questa classe ha già alcune regole implementate tramite gli attributi, dato che entrambe le proprietà sono marcate come Required. Logiche più complesse possono essere invece inserite all'interno del metodo Validate, esposto dall'interfaccia IValidatableObject. Ad esempio, possiamo verificare che StartDate sia sempre inferiore a EndDate:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (StartDate > EndDate) { yield return new ValidationResult("StartDate deve essere minore di EndDate"); yield return new ValidationResult("*", new string[] { "StartDate", "EndDate" }); } }
Questo metodo restitusce un IEnumerable
- la prima esprime la vera e propria regola infranta, non si riferisce ad alcuna proprietà in particolare, e verrà mostrata all'interno del ValidationSummary;
- la seconda ha invece l'indicazione delle proprietà errate, ossia StartDate e EndDate, e verrà gestita da ASP.NET MVC mostrando un asterisco in corrispondenza dei relativi campi di testo.
L'interfaccia IValidatableObject è gestita da ASP.NET MVC a livello di model binder e, quindi, non dobbiamo adottare alcun accorgimento all'interno del codice del controller che si limita a verificare il valore di ModelState.IsValid:
[HttpPost] public ActionResult EditInterval(DateInterval model) { if (!this.ModelState.IsValid) { return View(model); } return RedirectToAction("Index", "Home"); }
In caso di input errato, il risultato a video è quello mostrato in figura:
Ovviamente tale controllo avviene lato server, e pertanto è necessario comunque effettuare un POST della form di input prima di ottenere il messaggio di errore. In un prossimo script vedremo come possiamo ulteriormente migliorare il nostro oggetto, inserendo anche il supporto alla validazione client-side.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sfruttare lo streaming di una chiamata Http da Blazor
Reactive form tipizzati con FormBuilder in Angular
Eseguire operazioni sui blob con Azure Storage Actions
Utilizzare la libreria Benchmark.NET per misurare le performance
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Potenziare Azure AI Search con la ricerca vettoriale
Generare file PDF da Blazor WebAssembly con iText
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Miglioramenti nelle performance di Angular 16
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Creare un'applicazione React e configurare Tailwind CSS
I più letti di oggi
- C# 4
- Spaziatura tra i caratteri in Silverlight 5
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Segui in tempo reale il TechEd 2004
- da oggi è possibile fare login velocemente con LinkedIn e Google. a questi si aggiunge il supporto già attivo per Facebook, Twitter, Microsoft Account, Windows Hello e OpenID, per darvi sempre più possibilità di accedere semplicemente alla nostra community! #aspitalia
- Migrare una service connection a workload identity federation in Azure DevOps
- Evitare postback multipli in un UpdatePanel