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
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Ottimizzazione dei block template in Angular 17
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Evitare la script injection nelle GitHub Actions
Sfruttare lo streaming di una chiamata Http da Blazor
Reactive form tipizzati con FormBuilder in Angular
Utilizzare la libreria Benchmark.NET per misurare le performance
Evitare la command injection in un workflow di GitHub
Mascherare l'output di un valore all'interno dei log di un workflow di GitHub
Eseguire operazioni con timeout in React
Load test di ASP.NET Core con k6
I più letti di oggi
- annunciato #netstandard 2.1. .NET Core lo supporterà a partire da #netcore3, così come le prossime versione di #xamarin, #mono e #unity.il supporto per #netfx 4.8, invece, non ci sarà. https://aspit.co/bq2
- Annunciato Silverlight 4 RC e Windows Phone Developer Tools
- Speciale Razor: il nuovo view engine di WebMatrix e ASP.NET MVC
- Speciale Windows Store app: costruire app con WinRT per Windows 8
- Gestire lo stato all'interno di un class component di ReactJS
- Inserimenti bulk su database con la classe SqlBulkCopy di ADO.NET 2.0
- disponibile su MSDN la versione RTM di #VS2013 Update 2! https://aspit.co/auj #msTechEd