Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 11 de octubre de 2016
ASP.NET CoreComo ocurría en ASP.NET MVC 5 y anteriores, en ASP.NET Core MVC también podemos utilizar la información almacenada en la tabla de rutas para generar URLs hacia nuestras acciones, evitando las frágiles dependencias que introducen en las aplicaciones las direcciones hard-coded.

El framework nos ofrece distintas fórmulas para generar direcciones, aunque la más básica es utilizar extensores de IUrlHelper como Action(), Link() o RouteUrl(). Tenemos instancias de dicho interfaz disponibles en la propiedad Url de controladores y vistas, pero también podemos reclamarlas directamente al sistema de inyección de dependencias en otros contextos. Asimismo, en las vistas podemos utilizar helpers específicos para generar hipervínculos, como el clásico Html.Action(), o el más reciente tag helper <a>.

Los siguientes bloques de código muestran fórmulas válidas para conseguir un link hacia la misma funcionalidad de la aplicación, por ejemplo hacia la acción que visualiza un artículo en un catálogo, aunque con resultados ligeramente distintos sobre la ruta generada:

Generación del enlace Ruta generada

<!-- HTML + Url helper -->
<a href="@Url.Action("SHOW", "products", new { id=18 })">
    View product 18
</a>

/products/SHOW/18

<!-- Html helper -->
@Html.ActionLink("Show product 18",
    "show",        // Action
    "pRoDuCtS",    // Controller   
    new { id=18 }  // Route params
)

/pRoDuCtS/show/18

<!-- Tag helper -->
<a asp-controller="Products" 
   asp-action="Show" asp-route-id="18">
    Show product 18
</a>

/Products/Show/18

Si observáis, el uso de mayúsculas o minúsculas en la URL generada es arbitrario, un simple reflejo del casing utilizado por el desarrollador a la hora de codificar la generación del enlace. Desconozco si esto podría tener implicaciones en temas como el SEO por tratarse de direcciones distintas hacia el mismo recurso, pero lo que es seguro es que desde el punto de vista del usuario no queda muy elegante, y da sensación de falta de homogeneidad y criterio en el desarrollo.

Dado que lo habitual es que las direcciones usen exclusivamente minúsculas, ASP.NET Core MVC lo pone bastante sencillo. Basta con establecer la cierto la propiedad LowercaseUrls en las opciones de configuración del sistema de routing en la clase de inicialización:
public class Startup
{
    [...]

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.Configure<RouteOptions>(opt =>
        {
            opt.LowercaseUrls = true;
        });
    }
}
De esta forma, si volvemos a probar los ejemplos que vimos anteriormente, todos ellos generarán la misma dirección "/products/show/18", independientemente del casing usado al implementarlo :)

Ojo, hay que tener en cuenta que esto aplica exclusivamente a los parámetros que formarán parte de la ruta, pero no aquellos que aparecerán como parámetros adicionales de la query string. Es decir, usando la ruta por defecto de MVC tendremos el siguiente resultado:

Generación de ruta Resultado

Url.Action("SHOW", "products",
    new { 
          id="APPLE-iphone-4",
          extra="REFURBISHED"
    }
)

/products/show/apple-iphone-4?extra=REFURBISHED

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!