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
Creare gruppi di client per Event Grid MQTT
Creazione di componenti personalizzati in React.js con Tailwind CSS
Collegare applicazioni server e client con .NET Aspire
Ordine e importanza per @layer in CSS
Gestire domini wildcard in Azure Container Apps
Creare una libreria CSS universale - Rotazione degli elementi
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Usare il colore CSS per migliorare lo stile della pagina
Il nuovo controllo Range di Blazor 9
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Creare una custom property in GitHub
Gestione dei nomi con le regole @layer in CSS