¿Dónde y cómo se vincula el archivo de diseño _ViewStart.cshtml?

Aquí está el About.cshtml de la plantilla MVC 3 predeterminada:

@{ ViewBag.Title = "About Us"; } 

About

Put content here.

Esperaría que se encuentre una referencia al archivo _ViewStart en About.cshtml , pero claramente no es así.

He buscado en global.asax y web.config , pero no puedo averiguar cómo se “vincula” el archivo About.cshtml con el diseño del archivo _ViewStart.

Todo funciona como se esperaba, solo me gustaría saber qué está pasando bajo el capó …

Del blog de ScottGu :

A partir de la versión ASP.NET MVC 3 Beta, ahora puede agregar un archivo llamado _ViewStart.cshtml (o _ViewStart.vbhtml para VB) debajo de la carpeta \ Views de su proyecto:

El archivo _ViewStart se puede usar para definir el código de vista común que desea ejecutar al inicio de la representación de cada Vista. Por ejemplo, podríamos escribir código dentro de nuestro archivo _ViewStart.cshtml para establecer de manera programática la propiedad Diseño para cada vista para que sea el archivo SiteLayout.cshtml de forma predeterminada:

Debido a que este código se ejecuta al inicio de cada Vista, ya no es necesario establecer explícitamente el Diseño en ninguno de nuestros archivos de vista individuales (excepto si queremos anular el valor predeterminado anterior).

Importante: Debido a que _ViewStart.cshtml nos permite escribir código, opcionalmente podemos hacer que nuestra lógica de selección de Diseño sea más rica que solo un conjunto de propiedades básicas. Por ejemplo: podemos variar la plantilla de diseño que usamos dependiendo de qué tipo de dispositivo esté accediendo al sitio, y tener un diseño optimizado para teléfonos o tabletas para esos dispositivos, y un diseño optimizado para computadoras de escritorio / portátiles. O bien, si estuviéramos construyendo un sistema CMS o una aplicación compartida común que se utilizara entre varios clientes, podríamos seleccionar diseños diferentes para usar según el cliente (o su función) al acceder al sitio.

Esto permite una gran flexibilidad de UI. También le permite escribir con mayor facilidad lógica de vista una vez, y evitar repetirla en múltiples lugares.

También mira esto .

En un sentido más general, esta capacidad del marco de MVC para “saber” sobre _Viewstart.cshtml se llama “Codificación por convención”.

Convención sobre configuración (también conocida como encoding por convención) es un paradigma de diseño de software que busca disminuir el número de decisiones que los desarrolladores deben tomar, ganando simplicidad, pero no necesariamente perdiendo flexibilidad. La frase esencialmente significa que un desarrollador solo necesita especificar aspectos no convencionales de la aplicación. Por ejemplo, si hay una Venta de clases en el modelo, la tabla correspondiente en la base de datos se llama “ventas” por defecto. Solo si uno se desvía de esta convención, como llamar a la tabla “products_sold”, es necesario escribir un código con respecto a estos nombres.

Wikipedia

No hay magia para eso. Acaba de escribirse en el código base del marco MVC y, por lo tanto, es algo sobre lo que MVC “sabe”. Por eso no lo encuentras en los archivos .config o en otro lugar; en realidad está en el código MVC. Sin embargo, puede anular para alterar o anular estas convenciones.

Solo otro pensamiento.

Si desea tener su propio archivo cshtml como plantilla común, puede hacerlo de esta manera

Dentro de su _viewstart.cshtml puede mencionar su archivo cshtml común.

 @{Layout = "~/Views/Shared/_Layout.cshtml";} 

El código fuente es un lugar mucho mejor para buscar esto que la documentación.

Al hacer referencia al código MVC 6 de Github, tenemos algunos archivos de interés

—-actualizar—-

Debido a los cambios en la estructura de la fuente, ahora se puede encontrar la información sobre cómo se recostackn las páginas de inicio de sesión en RazorViewEngine.cs, busque la función “GetViewStartPages”.

—-/actualizar—-

Para responder cómo entran en juego, mira RazorView , que creo (debido a IView) está vinculado a la tubería de MVC. Este archivo tiene un método RenderAsync que se llama desde la interconexión de MVC para representar la vista solicitada.

RenderAsync realiza llamadas a RenderPage AND THEN RenderLayout (TENGA EN CUENTA EL PEDIDO). RenderPage primero realiza llamadas para tratar con archivos viewstart (tenga en cuenta el plural, podría haber más de un archivo _viewstart).

Por lo tanto, la información que busca se puede obtener de la función RenderViewStartAsync en el archivo RazorView.cs en el espacio de nombres Microsoft.AspNet.Mvc.Razor.

Esto puede agregar algo de información adicional a esta pregunta ahora (2016 ala MVC4, MVC5).

El motor Razor encuentra y ejecuta el código en _ViewStart.cshtml antes de cualquier otro código que se encuentre en el mismo directorio o subdirectorio donde se encuentra _ViewStart.cshtml .

Cualquier vista puede anular la propiedad Diseño o cualquiera de sus valores.

Si desea tener un diseño común para sus páginas, necesita definir el diseño común y asociar una vista con el diseño, tenemos que establecer la propiedad de diseño en cada vista, esto viola el principio DRY (No repetir). Para esto, .Net Framework ha proporcionado el archivo “_ViewStart.cshtml”, ubicado dentro de la carpeta de visualización. Colocamos la información de diseño en el archivo “_ViewStart.cshtml” y cada vista utiliza esta información de diseño por defecto. Si desea dar alguna información de diseño diferente, supongamos que en su vista de Inicio, puede crear un nuevo “_ViewStart.cshtml” con referencia a ese diseño y colocarlo en la carpeta “Vista de inicio”.