¿Forma correcta de usar _viewstart.cshtml y vistas parciales de Razor?

156

Estoy usando _viewstart.cshtml para asignar automáticamente el mismo diseño Razor a mis vistas.

Es un archivo simple muerto en la raíz de mi carpeta Vistas que se ve así:

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

Esto es más SECO que agregar la directiva @Layout a cada vista.

Sin embargo, esto plantea un problema para las vistas parciales de Razor , porque ejecutan el contenido de _viewstart.cshtml y, por lo tanto, se asignan incorrectamente un diseño, lo que hace que, um, ya no sean parciales.

Aquí hay un proyecto hipotético, que muestra el archivo _viewstart.cshtml, el archivo compartido _layout.shtml y una vista parcial ("AnonBar.cshtml").

Ejemplo de estructura del proyecto

Actualmente, la forma en que estoy evitando esto es agregando la siguiente línea a cada vista parcial:

@{
    Layout = "";
}

Esta parece ser la forma incorrecta de denotar una vista como parcial en Razor. (Tenga en cuenta que, a diferencia del motor de vista de formularios web, la extensión del archivo es la misma para vistas parciales).

Otras opciones que consideré pero que son aún peores:

  • Poner todas las vistas parciales en una carpeta común, para que puedan compartir un _viewstart.cshtml común. Esto rompe la convención de que las vistas estén en la misma carpeta que su controlador.
  • No usar vistas parciales.

¿Es esto algo que el equipo del motor de visualización Razor todavía está desarrollando o me falta un concepto fundamental?

Portman
fuente
3
Perdón por el tema, pero ¿qué son esos íconos junto a los nombres de archivo? :) Algún tipo de control de fuente ¿verdad?
Alex
66
@jitbit: VisualSVN
erict

Respuestas:

237

Si usted return PartialView()desde sus controladores (en lugar de return View()), _viewstart.cshtmlno se ejecutará.

marcind
fuente
66
Ajá, no sabía sobre la PartialViewResultclase. Eso era lo que necesitaba.
Portman el
66
Como seguimiento, he descubierto que necesito también establecer explícitamente el tipo de retorno del método de acción que PartialViewResulten lugar de la habitual ActionResult.
Portman el
2
@Portman, ¿tiene problemas cuando el tipo de retorno del método de acción no lo es ActionResult? Me sorprende que esto sea un problema porque el tiempo de ejecución MVC no debería comportarse de manera diferente en este caso (es decir, siempre y cuando el tipo devuelto por el método de acción sea ActionResulto cualquier clase derivada de él, las cosas deberían funcionar).
Marcind
@marcind Obtengo un desbordamiento de pila en w3wp.exe si configuro el tipo de retorno en ActionResult. Funciona bien si el tipo de retorno es PartialViewResult. ¿Crees que necesito presentar un error de conexión?
Portman el
Suena como uno para mí: grita si envías un error de conexión, lo votarás.
Dav