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, 22 de septiembre de 2015
imageDesde 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 @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 MyService
Como referencia visual, la pinta que podría tener un archivo _ViewImports.cshtml en un proyecto MVC 6 sería la siguiente:

El archivo _ViewImports

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.

2 Comentarios:

Julio Cesar Avellaneda dijo...

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!

José María Aguilar dijo...

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!