miércoles, 17 de septiembre de 2014

El archivo _viewstart en MVC Razor

Actualmente tenemos varias opciones para establecer layouts en nuestras páginas MVZ Razor. La forma más fácil es especificar en cada archivo de vista el layout que queremos utilizar de la siguiente manera:
@model Razor.Models.Product 
@{ 
ViewBag.Title = "Product Name"; 
Layout = "~/Views/_BasicLayout.cshtml"; 
} 
Product Name: @Model.Name 

En este caso establecemos la propiedad Layout de la vista para establecer la ruta al archivo de plantilla. Usar layouts tiene muchos beneficios. Nos permite simplificar las vistas, creando código HTML común y aplicarlo a múltiples vistas. De esta manera el mantenimiento de nuestras páginas será más sencillo.

Sin embargo con el planteamiento anterior tenemos un pequeño inconveniente y es que si cambiamos el nombre del archivo de layout, deberemos también cambiar el nombre en todas las vistas donde se utilice. Establecer esto en las aplicaciones puede ser algo redundante, lo que va en contra del principio DRY (Don't Repeat Yourself).

Para resolver este problema Razor pone a nuestra disposición el archivo _viewstart. Podemos añadir un archivo llamado _ViewStart.cshtml (o _ViewStart.vbhtml para VB ) en el directorio View de nuestro proyecto. Cuando se renderiza una vista, MVC buscará este archivo de manera automática y el contenido de este archivo será tratado como si estuviera incluido en la vista. De esta manera podremos omitir de nuestro código anterior la línea que establece la propiedad Layout y MVC usará el archivo _viewstart que hemos creado, para establecer el layout de nuestra vista.


@model Razor.Models.Product 
@{ 
ViewBag.Title = "Product Name"; 
} 
Product Name: @Model.Name 

Dos cosas a tener en cuenta a la hora de usar el archivo _viewstart:
  1. El contenido de este archivo, se usará en todas las vistas de la aplicación, que no tengan establecida la propiedad Layout. Si queremos que en una de las vistas se use otro layout distinto al del archivo _viewstart, deberemos establecerlo explicitamente. La propiedad layout de la vista tiene precedencia respecto al archivo _viewstart.
  2. Hay una diferencia entre omitir la propiedad layout y establecerla a null. Si la vista es autocontenida y no queremos usar un layout, entonces estableceremos la propiedad layout a nulo, lo que provocará que no se use el archivo _viewstart. Si omitimos este valor entonces MVC usará el archivo _viewstart.