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
Definire stili a livello di libreria in Angular
Ottimizzare la latenza in Blazor 8 tramite InteractiveAuto render mode
Usare lo spread operator con i collection initializer in C#
Gestire il colore CSS con HWB
Testare l'invio dei messaggi con Event Hubs Data Explorer
Utilizzare la session affinity con Azure Container Apps
Miglioramenti nell'accessibilità con Angular CDK
Miglioramenti agli screen reader e al contrasto in Angular
Eseguire operazioni sui blob con Azure Storage Actions
Generare token per autenicarsi sulle API di GitHub
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary