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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare politiche di resiliency con Azure Container App
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Gestire domini wildcard in Azure Container Apps
Ottimizzazione dei block template in Angular 17
Sfruttare al massimo i topic space di Event Grid MQTT
Gestire la cancellazione di una richiesta in streaming da Blazor
Sostituire la GitHub Action di login su private registry
Creare alias per tipi generici e tuple in C#
Ottimizzare il mapping di liste di tipi semplici con Entity Framework Core
Creare una libreria CSS universale: Cards