Configurare il routing in ASP.NET Core MVC

di Moreno Gentili, in ASP.NET Core,

ASP.NET Core MVC 1.0 mantiene un approccio convention-based che riduce il codice necessario a configurare la nostra applicazione web. Uno degli esempi caratteristici è quello del routing, il meccanismo che ci permette di legare un URL come /Products/Index all'esecuzione di un metodo Index (definito action) in una classe ProductsController.

In ASP.NET Core MVC, il RouterMiddleware è il componente che si occupa di esaminare gli URL delle richieste inviate dagli utenti e di verificare la loro corrispondenza con una delle route configurate nell'applicazione.

Per usare il RouterMiddleware, digitiamo quanto segue nel metodo Configure classe Startup. Ricordiamoci che l'ordine con cui vengono configurati i middleware è importante perché ne determinerà l'ordine di esecuzione.

//Usiamo il RouterMiddleware.
//Dovrebbe essere configurato DOPO altri middleware più prioritari
//come quello che serve i file statici.
app.UseMvc(routes =>
{
  routes.MapAreaRoute(
    name: "admin",
    areaName: "admin",
    template: "Admin/{controller=Dashboard}/{action=Index}/{id?}"
    );
  routes.MapRoute(
    name: "default",
    template: "{controller=Home}/{action=Index}/{id?}"
    );
});

Come si vede nell'esempio, l'extension method UseMvc ci permette di configurare una o più route, che verranno valutate dal RouterMiddleware in ordine strettamente sequenziale.

  • Con MapAreaRoute configuriamo le route per le eventuali sottosezioni del sito, come ad esempio un'area riservata o un blog aziendale;
  • Con MapRoute, tipicamente, configuriamo le route per la parte principale dell'applicazione web.

In entrambi i casi, la parte fondamentale della route è il suo template, ovvero una stringa contenente dei route parameter come {controller} e {action}. Essi rappresentano dei segnaposto per i nomi che il RouterMiddleware estrarrà dall'URL richiesto dall'utente e che dovranno trovare corrispondenza con il nome di un controller e di un'action nella nostra applicazione.

Per ogni route parameter possiamo:

  • Indicare il valore di default che assume quando viene omesso. E' grazie ai valori di default che una richiesta all'URL / può eseguire l'action Index all'interno dell'HomeController;
  • Renderlo opzionale accodando un punto interrogativo al suo nome, come nel caso di {id?}. In questo caso l'omissione di tale url parameter viene tollerata;
  • Impostare dei constraint per restringere i valori ammessi, come nel caso di {id:int} che richiederà all'utente di fornire ID interi in richieste come /Products/Detail/1.
    L'elenco completo dei constraint supportati è visibile nella documentazione di ASP.NET Core a questo indirizzo:
    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing#route-constraint-reference

Quando l'utente richiede un URL che non presenta tutti i route parameter richiesti o quando i valori vìolano constraints, allora il RouterMiddleware passerà a verificare la conformità della route successiva (se presente).

Nel caso in cui nessuna delle route dovesse risultare conforme, allora la richiesta produrrà un errore 404, a meno che nella nostra applicazione ASP.NET non siano stati configurati altri middleware in grado di gestire la richiesta.

Le route, oltre a definire le regole che legano gli URL all'esecuzione delle nostre action, possono essere sfruttate anche per la generazione dei link.

All'interno di una view Razor, usiamo il nuovo tag helper A per generare un link in maniera dichiarativa e in accordo con il template della route indicata.

<!-- Lato client si presenterà come <a href="/Products">Vai all'elenco</a> -->
<a asp-route="default" asp-route-action="Index" asp-route-controller="Products">Vai all'elenco</a>

Se nella nostra applicazione abbiamo configurato una sola route, allora possiamo usare la forma più compatta.

<a asp-action="Index" asp-controller="Products">Vai all'elenco</a>

Il codice si riduce ulteriormente se stiamo generando il link ad una action che riside nello stesso controller di quella attuale.

<a asp-action="Index">Vai all'elenco</a>

L'uso del tag helper A aumenta la leggibilità del codice HTML e ci permette in maniera molto naturale di aggiungere degli altri attributi, come ad esempio l'attributo class per assegnare uno stile CSS all'elemento.

<a asp-action="Index" class="btn btn-primary">Vai all'elenco</a>

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi