ASP.NET MVC - 在布局中有条件地渲染部分

Posted

技术标签:

【中文标题】ASP.NET MVC - 在布局中有条件地渲染部分【英文标题】:ASP.NET MVC - Render section conditionally in Layout 【发布时间】: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 中是否有任何解决方法用于此目的? 谢谢!

【问题讨论】:

【参考方案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 错误

以上是关于ASP.NET MVC - 在布局中有条件地渲染部分的主要内容,如果未能解决你的问题,请参考以下文章

关于ASP.NET MVC部分视图渲染问题。

如何在 ASP.NET MVC 中控制局部视图的条件显示

ASP.NET MVC JsonResult 日期格式

在 ASP.NET MVC 中使用 jQuery 渲染局部视图

在asp.net mvc 3项目中渲染部分视图onclick

ASP.NET MVC Razor 无编码渲染