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
Potenziare Azure AI Search con la ricerca vettoriale
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Routing statico e PreRendering in una Blazor Web App
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Gestire il colore CSS con HWB
Ordine e importanza per @layer in CSS
Miglioramenti nell'accessibilità con Angular CDK
Criptare la comunicazione con mTLS in Azure Container Apps
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Evitare la script injection nelle GitHub Actions
Le novità di Angular: i miglioramenti alla CLI
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core