MVC 3 – Nested layouts – sections don’t render in Areas

asp.net-mvc-3razor

Problem:

Given this nested layout structure:

~/Views/Shared/_layoutBase.cshtml
~/Views/Shared/_layout.cshtml

Where _layoutBase.cshtml is the layout for _layout.cshtml.

Any sections defined in the layout files render their content fine in pages under ~/Views/...

However, for views in an area, the sections are never rendered.

Setup:

_layoutBase:

<script type="text/javascript">
        @RenderSection("footerScripts", false)
    </script>
</body>
</html>

_layout.cshtml:

@section footerScripts{
    @RenderSection("footerScripts", false)
}

"content" view:

@section footerScripts{
$(function () {
    SetFocusOnForm("CaptchaCode", "NextButton");
});
}

The content of section footerScripts never gets rendered in a view in an area. It does get rendered in a view that is under the ~/Views folder.

Area _ViewStart.cshtml:

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

Question:

Can you see anything wrong?!

Best Answer

I am unable to reproduce the problem. Here's my setup and steps I did.

  1. Create a new ASP.NET MVC 3 application using the Internet Application Template
  2. Add ~/Views/Shared/_LayoutBase.cshtml:

    <!DOCTYPE html>
    <html>
    <body>
    @RenderBody()
    <script type="text/javascript">
        @RenderSection("footerScripts", false)
    </script>
    </body>
    </html>
    
  3. Replace the contents of ~/Views/Shared/_Layout.cshtml with this:

    @{
        Layout = "~/Views/Shared/_LayoutBase.cshtml";
    }
    
    @section footerScripts{
        @RenderSection("footerScripts", false)
    }
    
    @RenderBody()
    
  4. Right click on the project and add an Admin area

  5. Add a TestController to this admin area and add a corresponding ~/Areas/Admin/Views/Test/Index.cshtml view:

    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    <h2>Index</h2>
    
    @section footerScripts{
        alert('ok');
    }
    
  6. Run the application and navigate to /admin/test/index
  7. The alert is shown