Asp.net mvc 我可以选择不呈现布局页面中的特定部分吗?

Asp.net mvc 我可以选择不呈现布局页面中的特定部分吗?,asp.net-mvc,Asp.net Mvc,我有一个ASP.NET MVC布局页面,应用程序中的所有视图都使用该页面。每个视图都定义了一个“PanelRight”部分,该部分在布局页面中呈现。但是,现在我想用其他一些标记替换该部分。我原以为注释掉RenderSection指令并添加我的新标记一样简单,但我一直得到一个例外(“以下部分已经定义,但尚未为布局页面呈现”) 我理解例外的含义;我只想知道如何摆脱它。Id est,我不能呈现视图中定义的某个部分吗?因为我不想把所有的都看一遍,然后删除这个部分 编辑 我会尽量弄清楚的 假设这是我的布局

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

我理解例外的含义;我只想知道如何摆脱它。Id est,我不能呈现视图中定义的某个部分吗?因为我不想把所有的都看一遍,然后删除这个部分

编辑

我会尽量弄清楚的

假设这是我的布局页面:

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

@渲染部分(“右面板”,假)
@RenderBody()
这是我的许多观点之一:

@部分右面板{
这是该节的标记
}
这是我的观点
现在我决定,我希望有一个固定的内容,而不是每个视图都可以自定义的RightPanel部分。因此,我“删除”了部分,并用我想要使用的标记替换它-直接进入布局(实际上它将在另一个部分中,但不是在一个部分中,这就是重点)

当然,我不想通过查看所有视图来删除
@section RightPanel{}
。我只希望布局页面忽略该部分。为了进行比较,就像我用
DoFancyStuff()
方法定义了一个类,然后在客户机代码中我从未调用该方法。那里没有问题,所以我看不出它为什么会在这里


总而言之:视图定义了一个剖面,布局并不打算渲染它。这会导致一个错误。有办法做到这一点吗?

没有,视图中不能有布局未实现的部分。这将导致运行时错误,无法避免。每个人都告诉您如何实现可选部分的原因是,布局必须实现任何视图可能要使用的任何部分,但是,通过将其设置为可选,您可以允许某些视图使用某些部分,而其他视图使用其他部分

所以,如果我想“注释掉”一个RenderSection,如果只是为了测试,我真的需要遍历所有视图并删除该部分定义吗

从技术上讲,是的。虽然您可以简单地将该节包装为常规HTML注释
,但是在呈现时,它会呈现为HTML注释,而不是实际的DOM元素。此外,通过布局继承,您可以通过定义空部分来对视图的部分进行排序。例如:

\u Layout.cshtml

@RenderSection("Foo")
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }

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

@section Foo
{
    <!-- stuff here --> 
}
\u SubLayout.cshtml

@RenderSection("Foo")
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }

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

@section Foo
{
    <!-- stuff here --> 
}
SomeView.cshtml

@RenderSection("Foo")
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }

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

@section Foo
{
    <!-- stuff here --> 
}
@{Layout=“~/Views/Shared/_SubLayout.cshtml”}
@福科
{
}
Foo
将为空,因为子布局实现
Foo
,但不调用
@RenderSection(“Foo”)
本身,因此视图没有机会将其用作布局来更改该节。这对你现在并没有多大帮助,但很高兴知道这一点以供将来参考

我想你可以用一个不同的名称创建一个新的布局,并将当前布局中的内容移动到那里,同时使当前布局继承新布局。这将允许您实现此功能,而无需更新视图中的所有布局引用。然而,为了测试的目的,仅仅使用HTML注释来注释布局中的部分可能会更容易

更新

还有一件事。现在我在考虑它,我建议的布局继承方法作为一种潜在的方法,实际上可能不起作用。我突然想到,由于子布局没有调用
@RenderSection
,您可能仍然会得到一个错误。这完全取决于主布局中的初始调用是否足以满足需求。HTML注释绝对是最安全、最简单的方法

由OP更新

接受的答复:


你可以简单地用普通的HTML注释将该节包装起来,因此在呈现时,它会呈现为HTML注释而不是实际的DOM元素。

@CodeCaster,是的,它是该问题的重复,但该问题没有实际的答案。我和另一个OP都没有问如何使布局的所有部分都不必在视图中实现,答案解决了这个问题。相反,我们问我是否可以在视图中有一个部分,但不能在布局中使用它。是的,这是一个已经被问过的答案,但还没有被回答,而且有一个被接受的答案是错误的。答案是“必须呈现定义为非可选(默认)的部分”。“不,你不能”是一个有效的答案。你提到的唯一参考是公认答案中的这句话:“如果你不在视图中呈现它,那么它就不应该出错”。这显然是错误的。对不起,我想我(就像@Chris)误解了你的问题。一个节只定义一次,在实际的
@section
中注释掉(CS)HTML有那么难吗?如果您能显示一些(伪)代码,说明您的节和调用代码是什么样子,以及您希望它做什么,这可能会有所帮助。然后请参见:您将节渲染到
TextWriter.Null
,本质上将节渲染成一个黑洞。因此,如果我想“注释掉”一个渲染节,如果只是为了测试,我真的必须检查所有视图并删除该节定义吗-(HTML注释建议实际上可能有效。我会试试的。