Oltre a NonActionAttribute
visto nella lezione precedente, esistono anche molti altri attributi che svolgono un ruolo fondamentale all'interno di ASP.NET MVC, specialmente per quanto riguarda i controller. Il listato seguente rappresenta il nostro GalleryController
, a cui sono stati però aggiunti alcuni attributi di uso comune:
[HandleError] public class GalleryController : Controller { [Authorize] 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); } [Authorize(Roles="administrators, users")] [ActionName("image-detail")] [AcceptVerbs(HttpVerbs.Get)] 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); } }
Cominciamo la nostra analisi dal primo attributo, HandleError, applicato non ad un metodo ma direttamente alla classe GalleryController
. HandleError
è un attributo molto utile perchè consente di visualizzare una particolare vista nel caso in cui uno dei metodi del controller generi un'eccezione non gestista all'interno di un blocco try..catch
.
In linea con il concetto di Convention over Configuration, applicando l'attributo privo di argomenti, ASP.NET cercherà automaticamente una vista chiamata Error all'interno dell'applicazione.
È comunque possibile specificare una vista personalizzata utilizzando la seguente sintassi:
[HandleError(View="ErrorePersonalizzato")]
È anche possibile visualizzare un errore diverso per ogni tipo di eccezione generata:
[HandleError(View="ErroreArgomentoNullo", ExceptionType = typeof(ArgumentNullException))]
Nel listato precedente ASP.NET utilizzerà la vista "ErroreArgomentoNullo"
nel caso in cui venga generata una ArgumentNullException
.
L'attributo Authorize con cui sono stati decorati i metodi Index
e Detail
permette di eseguire l'azione soltanto nel caso in cui l'utente abbia effettuato il login. Authorize
per funzionare si appoggia sul provider Membership di ASP.NET.
È evidente quindi come ASP.NET MVC ci consenta di utilizzare le nostre conoscenze pregresse per sviluppare applicazioni con il nuovo framework. Un argomento dell'attributo Authorize
che ci capiterà molto spesso di utilizzare è Roles
, che consente di concedere l'accesso al metodo soltanto agli utenti appartenenti ad un determinato ruolo:
[Authorize(Roles="administrators, users")]
Continuando l'analisi troviamo altri due attributi applicati all'azione Detail
.
Il primo, ActionName, consente di specificare un nome diverso per l'azione. In particolare in questo caso, anche se il metodo si chiama Detail
, ASP.NET lo associerà all'URL:
/gallery/image-detail
Il secondo, AcceptVerbs, permette di selezionare i metodi HTTP con cui sarà possibile accedere all'azione. Assegnando HttpVerbs.Get
, come in questo caso, il framework MVC eseguirà l'azione soltanto in presenza di una richiesta HTTP GET
mentre genererà un errore per tutti gli altri metodi, come ad esempio POST
.
Selezionando soltanto un determinato metodo per l'azione è possibile gestire con semplicità scenari complessi quali la visualizzazione ed il successivo invio (POST
) di un form.