2012-05-05 7 views
8

gerarchia vista Data: Index.cshtml -> _Layout.cshtml -> _MasterLayout.cshtml:MVC: Come utilizzare le sezioni (rendering) dalla vista principale (principale) (Vista layout)?

_MasterLayout.cshtml - l'insieme di sezioni, che voglio usare nel layout principale (sotto)

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

_Layout.cshtml - sito attuale struttura master

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

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

Index.cshtml - qualche markup specifico per pagina concreto

L'idea di suddividere _Layout.cshtml e _MasterLayout.cshtml è la condivisione del codice. Ho una specie di libreria/framework e _MasterLayout appartiene a questa libreria. E _Layout.cshtml è un layout principale del sito dell'applicazione in cemento.

Sfortunatamente, questo schema non funziona. Durante il rendering _Layout.cshtml non vedrà le sezioni da _MasterLayout.cshtml.

Esiste un modo per utilizzare le sezioni in questo caso (prelevandole da una vista padre non da una vista figlio)?

Una possibile soluzione che posso vedere è la creazione di pagine separate per ogni sezione nel mio _MasterLayout.cshtml e chiamata @RenderPage in _Layout. Ma mi piacerebbe avere un singolo asset di condivisione (_MasterLayout.cshtml).

risposta

4

Cercare di invertire l'operazione. voglio dire in questo modo:

tua _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> 

tuo _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

Questo ha senso in effetti, ma _Layout.cshtml diventa innaturale (invece di markup html deve contenere il set di dichiarazioni @ section). Mi piacerebbe _Layout.cshtml per contenere l'intero layout di pagina e importare solo parti "standard" (cioè sezioni) da una sorgente (facilmente condivisa). – Shrike

Problemi correlati