2012-02-15 18 views
168

Aquí está la About.cshtml de la plantilla por defecto 3 MVC:¿Dónde y cómo se vincula el archivo de diseño _ViewStart.cshtml?

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

<h2>About</h2> 
<p> 
    Put content here. 
</p> 

yo esperaría que una referencia al archivo _ViewStart se encontraría en el About.cshtml, pero está claro que no lo es.

He buscado en global.asax y web.config, pero no puedo averiguar cómo el archivo About.cshtml está "vinculado" con el diseño del archivo _ViewStart.

todo funciona como se esperaba, sólo me gustaría saber lo que está pasando bajo el capó ...

Respuesta

197

De ScottGu's blog:

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

el archivo _ViewStart se puede utilizar para definir el código de vista común que w y para ejecutar al comienzo de la representación de cada Vista. Por ejemplo, podríamos escribir código dentro de nuestro archivo _ViewStart.cshtml a programación establecer la propiedad Layout para cada vista que se va el archivo SiteLayout.cshtml por defecto:

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

Importante: Como _ViewStart.cshtml nos permite escribir código, puede 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: podríamos variar la plantilla de diseño que usamos según el tipo de dispositivo que tenga acceso al sitio - y tenga un diseño optimizado para teléfonos o tabletas para esos dispositivos, y un diseño de escritorio optimizado para computadoras/computadoras portátiles . O si estuviéramos construyendo un sistema CMS o una aplicación compartida común que se utiliza en varios clientes , podríamos seleccionar diferentes diseños para usar dependiendo del cliente (o su función) cuando accedamos al sitio.

Esto permite una gran flexibilidad de UI. También le permite a más escribir fácilmente lógica de vista una vez, y evitar repetirla en múltiples lugares .

Ver también this.

+12

¿Es más o menos una característica "codificada" de MVC3? No tengo necesidad de cambiarlo a otra página "predeterminada", solo curiosidad por cómo se configuró. Gracias por solucionarlo :) – Kman

+1

Kman- Hardcoded, por convención (elija otro 'mango' aquí :)) - así que sí, exactamente. me alegro de que despejó la niebla –

+0

No es solo en su carpeta "Vistas" que puede necesitarla. Si agrega un RazorViewEngine personalizado para organizar vistas en otras carpetas, también debe incluir el archivo en la raíz de esas carpetas de vista alternativa. Por ejemplo, moví todas las vistas de plantilla de Inspinia a una carpeta y ejecuté esto en el motor de visualización 'ViewLocationFormats = ViewLocationFormats.Union (nueva cadena [] {" ~/Inspinia/ExampleViews/{1}/{0} .cshtml "}) .ToArray(); '. Como resultado, tuve que agregar una copia de mi archivo _ViewStart.cshtml a "~/Inspinia/ExampleViews", de lo contrario no se recogió y no se configuró. – Triynko

17

Solo otro pensamiento.

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

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

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

En un sentido más general, esta capacidad del marco MVC para "saber" sobre _Viewstart.cshtml se llama "Coding by convention".

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

Wikipedia

No hay magia a ella. 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.

+7

Si MVC lo sabe, ¿por qué Visual Studio no sabe y me lo señala? Si codificar por convención significa que todo funciona, siempre y cuando no se rompa la convención, es una mierda ... –

+0

No romper la convención es una especie de punto. AKAIK Ruby on Rails también sigue este paradigma. –

+0

+1 Raif. No tiene sentido defender una "codificación por convención" mal documentada. Podría decir eso acerca de cualquiera de mis códigos al revés. "¿Qué? ¿No esperabas que fallara cuando llegó a 33? Todos saben que saltas 33". Desafortunadamente, la falta de documentación para ASP.NET MVC es enorme. Los únicos documentos MS se generan automáticamente sin resúmenes de fuente interna. – shannon

10

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

Tomando como referencia la MVC 6 code de Github, tenemos algunos archivos de interés

---- ---- actualización

Debido a cambios en la estructura de origen, esta información puede ahora ser encontrado en RazorViewEngine.cs look para Función "GetViewStartPages".

----/---- actualización

ViewStartProvider, que es responsable de reunir una lista de archivos _ViewStart, tiene una función GetViewStartPages. Esta función depende de ViewStartHierarchyUtility para hacer el trabajo de obtener una lista de los archivos de viewstart. Esto responde cómo se recopilan los archivos de viewstart.

Para responder cómo entran en juego, mira RazorView, que creo (debido a IView) está vinculado a la tubería 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 (NOTE EL PEDIDO). RenderPage primero realiza llamadas para tratar con archivos viewstart (tenga en cuenta que puede haber más de un archivo _viewstart).

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

3

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

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

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

+1

esto es lo que estaba buscando, odio "no sé" lo que está sucediendo en mi proyecto, porque también estoy haciendo mis propias plantillas para VS y este archivo que acaba de salir del aire era muy difícil de entender –

0

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 DRY (No repetir Usted mismo) principio. 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 de forma predeterminada esta información de diseño. Si desea dar una información de diseño diferente, supongamos a su vista de Inicio, puede crear un nuevo "_ViewStart.cshtml" con referencia a ese diseño y colocarlo en la carpeta "Vista de inicio".

Cuestiones relacionadas