【问题标题】:ASP.NET MVC - Render section conditionally in LayoutASP.NET MVC - 在布局中有条件地渲染部分
【发布时间】:2013-10-11 07:19:27
【问题描述】:

我的 _Layout.cshtml 中有以下代码:

@if (SiteConfig.Instance.HasCustomMarkup)
{
     @RenderSection("bodyPart1", false)
     @RenderBody()
     @RenderSection("bodyPart2", false)
}
else
{
    <div id="mainContainer">
        @RenderBody()
    </div>        
}

所以我尝试仅在某些条件下渲染部分。但这不起作用,我有一个例外:

The following sections have been defined but have not been rendered for the layout page ...

mvc 中是否有任何解决方法用于此目的? 谢谢!

【问题讨论】:

    标签: asp.net layout conditional render


    【解决方案1】:

    为防止出现 The following sections have been defined but have not been rendered... 异常,您可以只模拟渲染调用而无需实际渲染。

    @if (SOME_CONDITION)
    {
        @RenderSection("SectionName", false)
    }
    else
    {
        var fakeSectionRender = RenderSection("SectionName", false);
        if (fakeSectionRender != null) {
            fakeSectionRender.WriteTo(TextWriter.Null);
        }
    }
    

    要考虑的缺点是性能,因为这种方法即使在不需要时也会强制渲染。

    【讨论】:

    • 请注意,在 Visual Studio 中,如果您使用的是 BrowserLink,这将导致错误提示“SectionName”已被渲染。奇怪的错误,很难追查。否则,此解决方案效果很好。
    【解决方案2】:

    只需检查部分是否存在,即:

    @if (IsSectionDefined("bodyPart1"))
    {
        @RenderSection("bodyPart1")
    }
    

    【讨论】:

    • 感谢您的回复!在我的情况下,它总是被定义。但我找到了可行的解决方案 - 将部分定义包装到 标记中,然后在运行时如果某些条件为真,则定义部分,这样我就不会遇到异常。
    • @igorGIS 请发表你的答案:)
    • 这实际上与 OP 发生的事情相反。如果您尝试渲染子页面中不存在的部分,上面的代码(现在已过时并覆盖了 rendersecction)将防止错误。当您在子页面上有部分,但在父页面上没有 RenderSection 方法时,会发生 OP 错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多