ASP.NET 5 MVC 6 ViewLocationExpander

Nota: Este post ha sido realizado con versiones previas de ASP.NET 5 y de Visual Studio 2015, lo aquí escrito puede variar con versiones  finales de la plataforma.

Seguro, que si ha trabajado con ASP.NET MVC una de las cosas que tiene claras es el concepto de Convention over Configuration, gracias al cual nos ahorramos mucho tiempo en configurar elementos que casi siempre tendrían que actuar de la misma, forma. Desde la selección del controlador, la acción, hasta el “binder” de los parámetros, hay muchos elementos “convencionales” en MVC, en esta ocasión hablaremos de como se buscan las vistas asociadas a una determinada acción, que como sabemos por convención corresponderían a las siguientes posibles rutas:

“~/Areas/{2}/Views/{1}/{0}.cshtml”, “~/Areas/{2}/Views/{1}/{0}.vbhtml”

“~/Areas/{2}/Views/Shared/{0}.cshtml”, “~/Areas/{2}/Views/Shared/{0}.vbhtml”

“~/Areas/{2}/Views/{1}/{0}.cshtml”, “~/Areas/{2}/Views/{1}/{0}.vbhtml”,

“~/Areas/{2}/Views/Shared/{0}.cshtml”, “~/Areas/{2}/Views/Shared/{0}.vbhtml

Hay muchos ejemplos dónde nos gustaría jugar con estas rutas, por ejemplo para cuando queramos usar versiones móviles, para ello pasamos de construirnos versiones completas de nuestro ViewEngine, como mostraba hace mucho tiempo ya Scott Hanselman hasta nuevas características en el framework como el uso de DisplayMode, pero lo que no había cambiado es que realmente, la forma de buscar en disco estas vistas no era un servicio dedicado que fuera simple de modificar sin tener que reescribir, aunque fuera una simple herencia, completamente nuestro ViewEngine. ASP.NET MVC 6 nos proporciona un mecanismo para “expandir” las rutas de disco dónde una vista puede ser localizada, para poder modificar este aspecto sin necesidad, como comentamos ahora mismo, de tener que reescribir todo el motor de vistas. Este servicio viene proporcionado por la interface IViewLocationExpander:

[snippet id=”209″]

Como se puede observar,  esta interfaz nos permite obtener un nuevo conjunto de rutas de disco donde buscar, por medio del método ExpandViewLocations, donde para su cálculo se podrán usar una serie de valores que podemos pre-configurar gracias al método PopulateValues. Con la finalidad de mostrar un ejemplo crearemos un pequeño ejemplo en el que dependiendo de un elemento en nuestra query string ( language ) iremos a un sitio u otro de nuestras rutas a buscar una vista personalizada, el código de este ejemplo es:

[snippet id=”210″]

Si se fija, básicamente lo que este código propone es que en el caso de recibir una url tal cual http://localhost:1278/home/index?language=es se habilitarán rutas que tengan en cuenta el parámetro es  para crear nuevas localizaciones.

Para registrar nuestros IViewLocationExpander solamente tenemos que acudir a nuestro Startup y registrar la configuracion de nuestro RazorViewEngine tal y como vemos a continuación:

[snippet id=”211″]

Saludos

Unai

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *