Migliorare la leggibilità degli URL con ASP.NET Core 2.2
A inizio dicembre è stato rilasciato ASP.NET Core 2.2 che introduce alcuni miglioramenti, soprattutto a livello di routing (https://blogs.msdn.microsoft.com/webdev/2018/08/27/asp-net-core-2-2-0-preview1-endpoint-routing/). Microsoft ha lavorato per rendere ASP.NET Core ancora più efficiente e alcune funzionalità troveranno la piena realizzazione con il futuro rilascio di ASP.NET Core 3.0.
Una delle novità consiste nell'introduzione dei route parameter transformer che ci consentono di alterare le convenzioni usate per instradare una richiesta HTTP verso l'action di un controller. Ad esempio, se l'utente inviasse una richiesta a /Products/Index, per convezione ASP.NET Core MVC selezionerebbe l'action Index del ProductsController.
Grazie a un route parameter transformer possiamo ridefinire la convenzione così che l'URL diventi indipendente dai nomi che abbiamo scelto per le action e i controller. Questa tecnica la usiamo principalmente per questioni stilistiche cioè per fare in modo che gli URL siano scritti in minuscolo o in formato kebab-case. Con molta moderazione, possiamo anche sfruttarlo per altre trasformazioni, tipo generare un URL nella nostra lingua come /prodotti/catalogo. In generale, un route parameter transformer ci permette di coniugare le nostre esigenze di sviluppatori, che solitamente scriviamo codice in PascalCase e in inglese, con quelle dei nostri utenti e degli specialisti SEO che invece potrebbero avere esigenze stilistiche diverse.
Dunque prepariamo il nostro route parameter transformer creando una classe che implementa l'interfaccia IOutboundParameterTransformer. L'interfaccia richiede l'implementazione del metodo TransformOutbound, in cui avverrà la trasformazione dei nomi.
public class ItalianizeParameterTransformer : IOutboundParameterTransformer { public string TransformOutbound(object value) { string valueAsString = value?.ToString(); //Ogni qualvolta deve essere generato un URL per l'action Index o per il controller Product //apportiamo invece una trasformazione. In questo esempio rendiamo i nomi minuscoli e in italiano. switch (valueAsString) { case "Products": return "prodotti"; case "Index": return "catalogo"; default: return valueAsString?.ToLower(); } } }
Registrare il route parameter transformer è una procedura che dipende dal tipo di applicazione che stiamo sviluppando. Vediamo come fare.
Registrare il route parameter transformer per ASP.NET Core MVC
Rechiamoci nel metodo ConfigureServices della classe Startup e registriamo il route parameter transformer come se fosse un route constraint.services.Configure<RouteOptions>(options => { options.ConstraintMap.Add("italianize", typeof(ItalianizeParameterTransformer)); });
Poi usiamo il nome "italianize" nel route template che si trova nel metodo Configure della classe Startup.
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller:italianize=Home}/{action:italianize=Index}/{id?}"); });
A questo punto, quando visitiamo l'URL /prodotti/catalogo, ASP.NET Core MVC selezionerà l'action Index del ProductsController.
Registrare il route parameter transformer per ASP.NET Core WebAPI e Razor Pages
Nelle applicazioni che sfruttano l'attribute routing, rechiamoci nel metodo ConfigureServices della classe Startup e, nel punto in cui aggiungiamo i servizi di ASP.NET Core MVC, registriamo il route parameter transformer dalle opzioni.
services.AddMvc(options => { var routeParameterTransformer = new ItalianizeParameterTransformer(); var routeConvention = new RouteTokenTransformerConvention(routeParameterTransformer); options.Conventions.Add(routeConvention); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
Come si vede nell'esempio, non dimentichiamo di indicare la CompatibilityVersion.Version_2_2 per sfruttare il nuovo meccanismo di routing di ASP.NET Core 2.2.
Conclusione
I route parameter transformer ci permettono di aggiungere un livello di indirezione tra l'URL e i nomi dei nostri controller e delle nostre action, in modo che possiamo applicare delle trasformazioni stilistiche. Per l'approfondimento, c'è un altro esempio di trasformazione stilistica trattato da Scott Hanselman nell'articolo pubblicato all'indirizzo https://www.hanselman.com/blog/ASPNETCore22ParameterTransformersForCleanURLGenerationAndSlugsInRazorPagesOrMVC.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Elencare le container images installate in un cluster di Kubernetes
Reactive form tipizzati con FormBuilder in Angular
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Sfruttare al massimo i topic space di Event Grid MQTT
Utilizzare l'operatore GroupBy come ultima istruzione di una query LINQ in Entity Framework
Copiare automaticamente le secret tra più repository di GitHub
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Utilizzare la session affinity con Azure Container Apps
Sfruttare lo stream rendering per le pagine statiche di Blazor 8
Installare le Web App site extension tramite una pipeline di Azure DevOps
Registrare servizi multipli tramite chiavi in ASP.NET Core 8
Short-circuiting della Pipeline in ASP.NET Core
I più letti di oggi
- Utilizzare Docker Compose con Azure App Service
- Utilizzare QuickGrid di Blazor con Entity Framework
- Modernizzare le applicazioni WPF e Windows Forms con Blazor
- ASP 3 per esempi
- 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
- Steel Style CheckBox per Silverlight 4.0