2012-05-05 16 views
8

jerarquía de vistas Dado: Index.cshtml -> _Layout.cshtml -> _MasterLayout.cshtml:MVC: ¿Cómo usar (renderizar) las secciones de la vista principal (principal) (Vista de diseño)?

_MasterLayout.cshtml - el conjunto de secciones que quiero usar en el diseño maestro (a continuación)

@section javascriptLinks { 
<script src="~/client/vendor/require-jquery.js" data-main="~/client/main.js" type="text/javascript"></script> 
} 
@RenderBody() 

_Layout.cshtml - actual sitio de diseño maestro

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

<!doctype html> 
<html> 
<!-- actual site layout here --> 
<body> 
@RenderBody() 
@RenderSection("javascriptLinks") 
</body> 
</html> 

Index.cshtml: alguna marca concreta de página específica

La idea de dividir _Layout.cshtml y _MasterLayout.cshtml es compartir código. Tengo un tipo de biblioteca/framework y _MasterLayout pertenece a esta biblioteca. Y _Layout.cshtml es un diseño maestro de sitio de aplicación concreto.

Desafortunadamente, este esquema no funciona. Durante la representación, _Layout.cshtml no verá secciones de _MasterLayout.cshtml.

¿Hay alguna manera de usar secciones en tal caso (tomándolas desde una vista principal no desde una vista secundaria)?

Una posible solución que veo es crear páginas separadas para cada sección en mi _MasterLayout.cshtml y llamar a @RenderPage en _Layout. Pero me gustaría tener un único recurso para compartir (_MasterLayout.cshtml).

Respuesta

4

Intente revertir la operación. quiero decir así:

su _MasterLayout.cshtml:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    @RenderSection("HeadSection", true) 
    <title>@ViewBag.Title</title> 
</head> 
<body> 
@RenderBody() 

// ...... 
// You could put your general scripts here 
<script src="~/client/vendor/require-jquery.js" data-main="~/client/main.js" type="text/javascript"></script> 
// Put true to enforce the sub layout to define Scripts section 
    @RenderSection("Scripts", true) 
</body> 
</html> 

Su _Layout.cshtml:

@{ Layout = "~/Views/_Shared/_LayoutMain.cshtml"; } 
@section HeadSection{ 
    // any thing you want 
    @RenderSection("HeadSection", false) 
} 
    @RenderBody() 
// ...... 
// Put false to make Scripts section optional 
@section Scripts{ 
    @RenderSection("Scripts", false) 
} 
+0

Esto tiene sentido, pero de hecho se convierte en _Layout.cshtml poco natural (en lugar de marcado HTML debe contener el conjunto de declaraciones @section). Me gustaría que _Layout.cshtml contenga todo el diseño de página y solo importe partes "estándar" (es decir, secciones) de alguna fuente (fácilmente compartida). – Shrike

Cuestiones relacionadas