Migliorare la leggibilità degli URL con ASP.NET Core 2.2

di Moreno Gentili, in ASP.NET Core,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi