2012-05-05 13 views
8

Biorąc hierarchia odsłon: Index.cshtml -> _Layout.cshtml -> _MasterLayout.cshtml:MVC: Jak korzystać z sekcji (renderowania) z widoku nadrzędnego (głównego) (widok układu)?

_MasterLayout.cshtml - zbiór odcinków, które chcę użyć w układzie master (poniżej)

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

_Layout.cshtml - rzeczywiste miejsce układ mistrz

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

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

Index.cshtml - niektóre konkretne znaczniki specyficzne dla strony

Pomysł dzielenia _Layout.cshtml i _MasterLayout.cshtml to dzielenie kodu. Mam rodzaj biblioteki/framework i _MasterLayout należy do tej biblioteki. A _Layout.cshtml to konkretny układ strony głównej aplikacji.

Niestety ten schemat nie działa. Podczas renderowania _Layout.cshtml nie zobaczy sekcji od _MasterLayout.cshtml.

Czy istnieje sposób korzystania z sekcji w takim przypadku (pobieranie ich od rodzica Nie widok z widoku dziecka)?

Jednym możliwym rozwiązaniem, jakie widzę, jest tworzenie oddzielnych stron dla każdej sekcji w moim _MasterLayout.cshtml i wywołanie @RenderPage w _Layout. Ale chciałbym mieć jeden zasób udostępniania (_MasterLayout.cshtml).

Odpowiedz

4

Spróbuj odwrócić operację. To znaczy tak:

Twój _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> 

Twój _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

to sens, ale w istocie staje się nienaturalny _Layout.cshtml (zamiast znaczniki html muszą zawierać zestaw deklaracji @sekcji). Chciałbym, aby _Layout.cshtml zawierał cały układ strony i importował tylko "standardowe" części (tj. Sekcje) z jakiegoś (łatwo współdzielonego) źródła. – Shrike

Powiązane problemy