I controller sono rappresentati all'interno del framework ASP.NET MVC da classi derivate dalla classe astratta Controller. La scelta di utilizzare interfacce e classi astratte è comune a molte altre componenti del framework che è stato sviluppato secondo un modello fortemente modulare, in modo da consentire allo sviluppatore di espanderne le funzionalità di base o di sostituirle con altre in modo estremamente semplice.
Esempio di controller in ASP.NET MVC
[HandleError]
public class GalleryController : Controller
{
public ViewResult Index()
{
// Estraggo la lista delle immagini dal database
GalleryDataContext context = new GalleryDataContext();
List<GalleryImage> images = context.GetImages();
// Richiamo la vista corrispondente all'azione
// In questo caso la vista mostrerà la lista delle immagini
return View(images);
}
public ViewResult Detail(int id)
{
// Estraggo dal database le informazioni per l'immagine indentificata dall'intero id
GalleryDataContext context = new GalleryDataContext();
var image = context.GetImageById(id);
// Richiamo la vista corrispondente all'azione
// In questo caso la vista mostrerà una immagine singola
return View(image);
}
}
Il codice precendete è una porzione del controller GalleryController che ha il compito di gestire la galleria di immagini. I metodi dichiarati all'interno dei controller, in questo caso Index e Detail, prendono il nome di azioni (action) e rispondono ad un particolare URL richiamato dall'utente.
| Url | Controller | Azione |
|---|---|---|
http://www.miosito.com/ |
HomeController | Index |
http://www.miosito.com/gallery |
GalleryController | Index |
http://www.miosito.com/gallery/detail/1 |
GalleryController | Detail (id = 1) |
Il compito di associare un particolare URL all'azione di un controller è svolto dalle classi del namespace System.Web.Routing, che esamineremo con maggior dettaglio più avanti nella guida. L'azione Index del nostro controller GalleryController restituisce una vista corrispondente alla homepage della galleria di immagini, l'azione Detail la vista che contiene informazioni su una singola immagine, e così via. In generale avremo una vista diversa per ciascuna azione dichiarata all'interno di un controller.
Nel caso dell'immagine singola (azione Detail), l'ID dell'immagine da recuperare viene passato ad ASP.Net MVC tramite URL:
http://www.miosito.com/gallery/detail/1
È importante notare che ogni funzione termina con una chiamata al metodo View(). Il valore restituito da questa funzione è anche quello restituito dall'azione del controller:
public ViewResult Detail(int id)
{
...
return View(...); // l'action restituisce il valore ritornato da View()
}
Il metodo View
View() è un metodo definito nella classe padre Controller che si preoccupa di cercare automaticamente la vista da associare all'azione.
In genere - o meglio - convenzionalmente, una azione viene associata alla vista che ha il suo stesso nome. Ad esempio, per il nostro controller, dovremmo creazione la vista Index per l'azione Index e la vista Detail per il metodo Detail.
Questo metodo presenta molti overload utili in diverse situazioni. Ad esempio nel caso in cui la vista non avesse lo stesso nome dell'azione, è sufficiente richiamare la funzione passandogli il nome della vista da utilizzare:
public ViewResult Detail(int id)
{
...
return View("VistaConNomeDiversoDallAzione");
}
Nel nostro controller utilizziamo un altro overload della funzione View(), utile per rendere disponibili nella vista i dati estratti dal model:
Esempio di controller in ASP.NET MVC
public ViewResult Detail(int id)
{
// Estraggo dal database le informazioni per l'immagine indentificata dall'intero id
GalleryDataContext context = new GalleryDataContext();
var image = context.GetImageById(id);
// Richiamo la vista corrispondente all'azione e gli passo i valori estratti
return View(image);
}
Vedremo come mostrare queste informazioni all'utente nella parte della guida dedicata alle viste. Per la lista completa degli overload del metodo View(), possiamo consultare la documentazione ufficiale.
Se vuoi aggiornamenti su .NET inserisci la tua email nel box qui sotto: