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.