Nested layouts for MVC5

19,810

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.

Share:
19,810

Related videos on Youtube

Tim
Author by

Tim

Updated on September 15, 2022

Comments

  • Tim
    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
    Tim over 9 years
    I 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
    Leo over 7 years
    @Tim he actually answered your question correctly. If this is not what you wanted then your question was formulated incorrectly