2011-11-18 20 views
11

Digamos que tengo la siguiente estructura en mi aplicación ASP.NET MVC 3.¿Por qué mi página .cshtml necesita definir contenido?

  • Artículos
    • Index.cshtml
  • Categorías
  • compartido
    • _Index.cshtml
    • _Site.cshtml
    • Index.cshtml

Tanto Index.cshtml archivos utilizan _Index.cshtml como el diseño de página y _Index está anidado dentro del diseño _Site.

Items/Index implementa las secciones opcionales definidas en _Index. Shared/Index está vacío.

La vista Items/Index funciona bien. Dado que Categorías no tiene un índice, usa el de la carpeta compartida. Esto no funciona.

que arroja el error

El método "RenderBody" no ha sido llamado para diseño de página "~/Views/Shared/_Index.cshtml".

If _Site llamadas RenderBody y _Index hereda de _Site, no el contenido en _Index satisfacer la requerida RenderBody llamada y Shared/Index.cshtml puede estar en blanco?

La razón por la que pregunto es porque tengo una aplicación ASP.NET MVC 1 que implementó esta estructura usando páginas maestras y funcionó bien, pero la conversión a MVC 3 con Razor está causando este problema.

Aquí es el esquema básico de lo que estoy describiendo:

_Site.cshtml

<!DOCTYPE html> 
// head 
<body> 
    @RenderBody() 
</body> 

_Index.cshtml

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

<div id="sub-menu"> 
    // Markup 
</div> 

// More markup 

@RenderSection("SectionOne", required: false) 

@RenderSection("SectionTwo", required: false) 

Artículos/Index.cshtml (Trabajo)

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

@section SectionOne { 
    // Markup 
} 

Compartido /Index.cshtml (error RenderBody)

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

// Rest of this file is empty 

Respuesta

11

No estoy seguro de que te sigo por completo, pero TODAS las páginas de diseño tiene que tener un RenderBody(), incluso si están anidados. RenderBody() representa el contenido para el "niño". Cuando tiene páginas de diseño anidadas, el diseño anidado es el secundario del principal y su salida debe representarse en el RenderBody.Del mismo modo, el hijo del niño tiene que presentar su cuerpo en la página del medio.

Para decirlo de otra manera, cualquier cosa que no esté en una @sección se considera el "cuerpo". Por lo tanto, _Index.cshtml necesita representar su cuerpo (Index.cshtml) y _Site.html tiene que mostrar su cuerpo (_Index.cshtml). Sube la cadena

EDIT:

parece que un diseño tiene que hacer al menos una sección, ya sea con un RenderBody() o una RenderSection(). Si bien puede ser cierto que las secciones son opcionales, la representación de al menos una sección no lo es. Agregue una sección vacía a su Index.cshtml o agregue un RenderBody() a su _Index.cshtml.

+0

Mi _Index.cshtml no llama a @RenderBody embargo. _Index solo implementa las secciones de _Site, y define algunas nuevas. Luego Item/Index implementa algunas de las secciones _Index. Eso es. – Brandon

+0

@Brandon - Tal vez sería útil incluir algún código cshtml básico que ilustrara, porque simplemente no entiendo lo que está describiendo. –

+0

pregunta actualizada. Tal vez no estoy implementando páginas anidadas correctamente, pero eso es básicamente su estructura. – Brandon

Cuestiones relacionadas