martes, 22 de septiembre de 2015
Desde la llegada de Razor, hace ya bastante tiempo, usamos en ASP.NET MVC el archivo _ViewStart.cshtml de las carpetas de vistas de nuestra aplicación para introducir código de inicialización de éstas. Era un buen lugar para establecer propiedades como el Layout de forma genérica, sin tener que hacerlo en cada una de las vistas que se encontraran por debajo en el árbol de directorios en el que se definía.
En ASP.NET Core MVC 1.0 se le ha unido un compañero llamado _ViewImports.cshtml, cuya finalidad y funcionamiento es parecido al tradicional ViewStart, porque se procesa antes de ejecutar una vista e igualmente afecta a todas las vistas que se encuentren por debajo de este archivo en el árbol de directorios, aunque aporta algunas diferencias bastante interesantes. Comentamos a continuación los aspectos más destacables.
En primer lugar, destacaremos que _ViewImports.cshtml se procesa en todas las vistas. Esto es bastante interesante porque abre el ámbito de aplicación de este nuevo mecanismo; recordad que _ViewStart sólo era ejecutado en las vistas completas y no en parciales o layouts.
El objetivo de _ViewImports no es contener código, sino directivas que serán aplicadas a todas las vistas (sean completas, parciales o layouts). Es decir, aquí no encontraremos bloques de código ejecutables como en _ViewStart, sino directivas
En este archivo encontraremos “usings” de espacios de nombres, de forma que en las vistas afectadas tendremos acceso directo a los miembros definidos en ellos sin necesidad de añadir
También encontraremos ahí directivas
Asimismo, desde este archivo será posible inyectar servicios que estarán disponibles para todas las vistas afectadas utilizando la directiva @inject de MVC. Por ejemplo, si incluimos en _ViewImports.cshtml la siguiente línea, todas las vistas tendrán una propiedad llamada
Y por último, sólo comentar que hasta hace poco este archivo se llamaba _GlobalImports.cshtml, pero se decidió cambiar el nombre porque podía resultar confuso, dado que en realidad no se tratan de importaciones globales sino que afectan sólo a determinadas vistas según su ubicación. Es importante tener esto en cuenta porque aún hay muchos artículos y contenidos por la red que hacen referencia a la denominación antigua.
Publicado en Variable not found.
En ASP.NET Core MVC 1.0 se le ha unido un compañero llamado _ViewImports.cshtml, cuya finalidad y funcionamiento es parecido al tradicional ViewStart, porque se procesa antes de ejecutar una vista e igualmente afecta a todas las vistas que se encuentren por debajo de este archivo en el árbol de directorios, aunque aporta algunas diferencias bastante interesantes. Comentamos a continuación los aspectos más destacables.
En primer lugar, destacaremos que _ViewImports.cshtml se procesa en todas las vistas. Esto es bastante interesante porque abre el ámbito de aplicación de este nuevo mecanismo; recordad que _ViewStart sólo era ejecutado en las vistas completas y no en parciales o layouts.
El objetivo de _ViewImports no es contener código, sino directivas que serán aplicadas a todas las vistas (sean completas, parciales o layouts). Es decir, aquí no encontraremos bloques de código ejecutables como en _ViewStart, sino directivas
@algo
de Razor.En este archivo encontraremos “usings” de espacios de nombres, de forma que en las vistas afectadas tendremos acceso directo a los miembros definidos en ellos sin necesidad de añadir
@using
en cada una de ellas. Esto es importante porque en versiones anteriores de MVC esto sólo podía hacerse desde el archivo Web.config presente en las carpetas de vistas y, como sabemos, este archivo de configuración pasó a la historia. También encontraremos ahí directivas
@addTagHelpers
, que es el nuevo mecanismo que permite añadir referencias a paquetes de Tag Helpers que utilicemos en las vistas afectadas por _ViewImports. Pronto veremos algún post sobre ellos, pero de momento basta con saber que es un mecanismo similar a los helpers de toda la vista, pero usando sintaxis más cercana al HTML. Podéis leer algo sobre ellos aquí.Asimismo, desde este archivo será posible inyectar servicios que estarán disponibles para todas las vistas afectadas utilizando la directiva @inject de MVC. Por ejemplo, si incluimos en _ViewImports.cshtml la siguiente línea, todas las vistas tendrán una propiedad llamada
MyService
que el servicio de inyección de dependencias del framework habrá poblado con una instancia de IMyService
:@inject IMyService MyServiceComo referencia visual, la pinta que podría tener un archivo _ViewImports.cshtml en un proyecto MVC 6 sería la siguiente:
Y por último, sólo comentar que hasta hace poco este archivo se llamaba _GlobalImports.cshtml, pero se decidió cambiar el nombre porque podía resultar confuso, dado que en realidad no se tratan de importaciones globales sino que afectan sólo a determinadas vistas según su ubicación. Es importante tener esto en cuenta porque aún hay muchos artículos y contenidos por la red que hacen referencia a la denominación antigua.
Publicado en Variable not found.
Publicado por José M. Aguilar a las 9:10 a. m.
Etiquetas: aspnetcore, aspnetcoremvc, desarrollo, novedades
2 Comentarios:
Hola crack, como siempre un excelente post, definitivamente el cambio es un poco duro a está nueva versión, pero muy positivo! Solo espero que en este "nuevo" _ViewImports no referencien de todo, sino vamos a terminar con un archivo gigante donde realmente pocas se usan, importante usarlo con precauciíon y referenciar solo lo que es común, como bien aclaraste, se ejecuta antes que TODAS las vistas (sean del tipo que sean).
Un saludo!
Hola, Julio!
Pues sí, como casi todo en este mundo, hay que usar este archivo con mesura y conocimiento de causa. Por ejemplo, aunque los @using o @addTagHelpers no deberían penalizar el rendimiento en ejecución (son directivas), los @inject si podrían repercutir negativamente si inyectamos muchas referencias o usamos clases de carga pesada.
Muchas gracias por comentar!
Enviar un nuevo comentario