我可以选择不在布局页面中呈现某个部分吗?

时间:2014-11-12 15:15:04

标签: asp.net-mvc

我有一个ASP.NET MVC布局页面,我的应用程序中的所有视图都使用它。这些视图中的每一个都定义了一个“PanelRight”部分,该部分在布局页面中呈现。但是,现在我想用其他标记替换该部分。我认为它就像评论RenderSection指令并添加我的新标记一样简单,但我不断得到一个例外(“以下部分已定义,但尚未为布局页面呈现”)。

我理解异常的含义;我只想知道如何摆脱它。 Id est,我不能渲染视图中定义的某个部分吗?因为我宁愿不经历所有这些并删除该部分。

修改

我会试着更清楚。

假设这是我的布局页面:

<html>
    <head> <!-- HEAD STUFF --> </head>
    <body>
        @RenderSection("RightPanel", false)
        @RenderBody()
    </body>
</html>

这是我的许多观点之一:

@section RightPanel {
    <div>This is the markup of the section</div>
}

<div>This is the body of my view</div>

现在我决定,而不是拥有可以由每个视图自定义的RightPanel部分,我希望有一个固定的内容。所以我“删除”该部分并将其替换为我想要使用的标记 - 直接进入布局(实际上它将在另一部分中,但不在部分中,这就是重点)。

当然,我不想浏览所有许多视图来删除@section RightPanel { }。我只想要布局页面忽略部分。为了进行比较,就像我使用DoFancyStuff()方法定义了一个类,然后在客户端代码中我从不调用该方法。那里不是问题,所以我认为没有理由在这里。

回顾一下:视图定义了一个部分,布局不打算渲染它。这会导致错误。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

不,您的视图中没有一个部分表明您的布局没有实现。这将导致运行时错误,并且没有办法解决这个问题。每个人都告诉你如何实现可选节的原因是因为布局必须实现任何视图可能要使用的任何部分,但是,通过使其可选,您可以允许某些视图使用某些部分,而其他视图使用其他部分。 / p>

  

所以,如果我想&#34;评论&#34;一个RenderSection,如果仅用于测试,我是否真的必须浏览所有视图并删除该部分定义?

技术上,是的。虽然您可以简单地将该部分包装在常规HTML评论<!-- -->中,但在呈现时,它会呈现为HTML注释而不是实际的DOM元素。此外,通过布局继承,您可以对视图进行短路处理。部分通过定义空部分。例如:

<强> _Layout.cshtml

@RenderSection("Foo")

<强> _SubLayout.cshtml

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

@section Foo {}

<强> SomeView.cshtml

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

@section Foo
{
    <!-- stuff here --> 
}

部分Foo将为空,因为子布局实现了Foo,但也没有调用@RenderSection("Foo")本身,因此没有机会进行观看使用它作为布局来改变该部分。这对你现在真的没有多大帮助,但知道以后参考是件好事。

我想你可以创建一个具有不同名称的新布局,并将当前布局中的东西移动到那里,同时使当前布局继承新布局。这样就可以实现这一点,而无需更新视图中的所有布局引用。但是,为了测试目的,仅使用HTML注释来评论布局中的部分可能会更容易。

<强>更新

还有一件事。现在我正在考虑它,我建议作为一种潜在方法的布局继承方法可能实际上不起作用。在我看来,您可能仍会收到错误,因为子布局不会调用@RenderSection。这完全取决于主布局中的初始调用是否足以满足。 HTML评论绝对是最安全和最简单的方法。

更新OP

接受的答案:

您可以简单地将该部分包装在常规HTML评论<!-- -->中,因此在呈现时,它会呈现为HTML注释而不是实际的DOM元素。