Nested layouts for MVC5
Solution 1
I know it's an old question. I thought I'd share this anyway in case anyone else runs into this (like I did).
At the bottom of your child layout, you define a section with the same name as the section in the parent layout. Inside of this section you simply put a @RenderSection
, again specifying the same name as before. Once this is in place, you essentially have the child layout "bypass" content from pages, up to its parent layout:
@section breadcrumbs {
@RenderSection("breadcrumbs", true)
}
Solution 2
Not sure if you still need help, but I'll answer anyways.
There RenderSection method takes the following parameters according to the MSDN Documentation:
public HelperResult RenderSection(
string name,
bool required
)
Parameters
name
Type: System.String
The section to render.
required
Type: System.Boolean
true to specify that the section is required; otherwise, false.
Change the call to:
@RenderSection("breadcrumbs", false);
If the section "required" parameter is false, it will not give an error if that section is not included by a view.
Related videos on Youtube
Tim
Updated on September 15, 2022Comments
-
Tim over 1 year
I've seen a few posts on this topic:
Razor Nested Layouts with Cascading Sections
MVC 3 - Nested layouts - sections don't render in Areas
And it always seems to be problematic. However they are both pretty old so wondering if things have changed.
Basically I have a master layout, and 3 different body templates based on what kind of page it is. For examples sake:
_Layout.cshtml
<html lang="en"> <head> </head> <body style="padding: 50px 0;"> <header class="navbar navbar-default navbar-fixed-top" role="banner"> @Html.Partial("_MenuPartial") </header> <ol class="breadcrumbs"> @RenderSection("breadcrumbs", true); </ol> <section> @RenderBody(); </section> <footer class="navbar navbar-default navbar-fixed-bottom"> @Html.Partial("_FooterPartial") </footer> @Html.Partial("_ScriptInitPartial") </body> </html>
_LayoutForEdit.cshtml
<div class="panel panel-primary"> <div class="panel-body"> <div class="col-lg-2"> <ul class="nav nav-pills nav-stacked"> @RenderSection("tabs", true) </ul> </div> <div class="col-lg-10"> <div class="tab-content"> @RenderBody() </div> </div> </div> <div class="panel-footer"> <button class="btn btn-primary" data-bind="enable: Entity.isValid, click: save">Save</button> </div> </div>
Now this renders fine when called. Almost.
The rendering of sections must be in the child layout it seems. If I try to put the breadcrumbs in the
_Layout.cshtml
, it will fail because_LayoutForEdit.cshtml
never rendered it. How can I fix this?The following sections have been defined but have not been rendered for the layout page "~/Views/Shared/_LayoutForEdit.cshtml": "breadcrumbs".
-
Tim over 9 yearsI don't need help anymore, and it sounds like you've misunderstood the problem. I am defining breadcrumbs in the body, which is a partial view attached to a partial view, and the nesting blocks the section being detected.
-
Leo over 7 years@Tim he actually answered your question correctly. If this is not what you wanted then your question was formulated incorrectly