Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Validazione dei dati e gestione degli errori

Convalidare i dati inseriti nei form
Convalidare i dati inseriti nei form
Link copiato negli appunti

Nella nostra panoramica sulla gestione dei form in ASP.Net MVC ci siamo occupati di raccogliere i dati e di inserirli nel database, tralasciando, per semplicità, una componente tuttavia fondamentale in scenari che includono l'interazione con l'utente: la validazione dell'input.

Ogni volta in cui ci troviamo ad accettare informazioni tramite form, infatti, dobbiamo preoccuparci di controllare che questi dati siano completi e non contengano codici malevoli.

In ASP.NET MVC possiamo scegliere di delegare il compito di vigilanza sia al Model, includendo al suo interno delle regole di validazione, sia al Controller, integrando il meccanismo all'interno delle azioni.

Scegliendo la prima opzione avremo un codice fortemente strutturato e molto flessibile: se in futuro decidessimo di modificare le classi del Model avremmo infatti soltanto bisogno di aggiornare le regole di validazione all'interno di quest'ultimo, senza dover agire sulle altre parti dell'applicazione.

Per progetti molto semplici non vale la pena implementare un sistema di questo tipo, che può risultare abbastanza complesso. Nel nostro esempio ci affideremo quindi alle azioni del controller per effettuare una rudimentale validazione dell'input.

In particolare, la nostra azione dovrà controllare i dati e mostrare nuovamente all'utente il form nel caso in cui si verifichino degli errori. Vediamo quindi come implementare queste funzionalità all'interno dell'azione vista in precedenza per la modifica di una immagine:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection values)
{
  // Preleva l'immagine dal database
  GalleryDataContext context = new GalleryDataContext();
  GalleryImage image = context.GetImageById(id);
  
  try
  {
    if (image == null)
    throw new Exception("Immagine non trovata.");
    
    // Controlla che tutti i campi richiesti siano stati inseriti
    if (string.IsNullOrEmpty(values["FileName"]))
      ModelState.AddModelError("FileName", "Nome richiesto");
    
    if (string.IsNullOrEmpty(values["FileExtension"]))
      ModelState.AddModelError("FileExtension", "Estensione richiesta");
    
    if (ModelState.IsValid)
    { 
      // Tutto ok, aggiorna l'immagine
      UpdateModel<GalleryImage>(image);
      context.SubmitChanges();
      
      // Reindirizza l'utente all'immagine aggiornata
      return RedirectToAction("Detail", new { id = image.ImageId });
    }
  }
  catch (Exception ex)
  {
    // Si è verificato qualche errore
    ModelState.AddModelError("Errore", ex);
  }
  
  // Mostra di nuovo la vista
  return View();
}

La modifica più consistente riguarda l'aver inserito quasi tutta la logica dell'azione all'interno di un blocco Try..Catch: così facendo saremo al sicuro da tutte le eccezioni che potrebbero essere generate dal nostro codice. Le prime righe all'interno del blocco Try controllano che l'utente abbia inserito tutti valori richiesti all'interno del form. Nel caso in cui un campo non sia stato compilato correttamente verrà aggiunto un errore all'interno della collection ModelState.

ModelState è una proprietà dei controller deputata alla gestione di errori che possono avvenire all'interno del Model. Possiamo aggiungere un errore all'interno del ModelState attraverso la seguente sintassi:

ModelState.AddModelError("nome_proprietà", "testo di errore");

Per controllare la validità del ModelState è sufficiente verificare il valore della proprietà IsValid:

if (ModelState.IsValid)
{
    // Model state valido
}
else
{
    // C'è qualche errore
}

Come vedremo tra poco, la vera forza di questo sistema risiede nella forte integrazione con alcuni helper HTML nelle viste.

Ti consigliamo anche