我可以有一个MVC的部分/儿童视图,该视图不会以递延的方式呈现



从我可以看出的情况下,MVC似乎对部分视图的对待与主要视图不同。似乎我可以在主视图中访问对象,但如果将对象返回后将处置该对象,则不能访问其子女(请参阅此处的问题)。

我假设这是为了促进异步通过Ajax或其他方法在主控制器操作中的对象后很长时间更新这些部分视图。这对我来说很有意义。

我现在尝试使用部分视图的方式,我不需要此异步更新功能。我可以将部分视图全部剪切在一起,然后将所有视图放在一起,但是我想要的只是一种将我的视图分割成较小的块,而不是将它们全部放在一个巨大的文件中。

理想情况下,我希望能够将对象从我的控制器传递到我的视图,在视图和任何孩子/子视图中使用该对象,并仅在视图及其sub/sib/child之后处理对象视图已经完成了。

编辑 - 添加示例

我在一个文件中具有很大的复杂视图。想象一下,每行实际上都是一个更大,更复杂的视图标记和代码:

viewStuff.cshtml

ViewStuff
ViewStuff
MoreViewStuff
MoreViewStuff
MoreViewStuff
ViewStuff
EvenMoreViewStuff
EvenMoreViewStuff
EvenMoreViewStuff
ViewStuff

我想将此视图分解为一些单独的文件,以方便和维护,有效地将其部分提取到子视图,例如"提取方法"重构:

viewStuff.cshtml

ViewStuff
ViewStuff
RenderPartialViewOf MoreViewStuff
ViewStuff
RenderPartialViewOf EvenMoreViewStuff
ViewStuff

moreviewstuff.cshtml

MoreViewStuff
MoreViewStuff
MoreViewStuff

evenmoreViewStuff.cshtml

EvenMoreViewStuff
EvenMoreViewStuff
EvenMoreViewStuff

根据我的说法,部分视图似乎是答案,尽管似乎有很多人可以使用。我遇到的问题是,我的控制器正在将对象传递到当控制器操作返回时处置的视图。

在"一个文件中的所有"方案中,我可以成功利用对象构造完整视图,因为整个视图是在方法返回和对象处置之前构造的。但是,这不是理想的选择,因为它意味着大,长,单片的视图文件以及后来的部分重复。

在"多个文件"方案中,主视图可以访问对象罚款,因为它尚未被处置。但是,在部分视图获得它之前,主要控制器动作方法返回,处置对象。结果是部分视图中的错误,寻找不再可用的对象。

我想要的是一种构造由多个块的完整视图的方法,在控制器方法处置我的对象之前。

再次,请参阅我的另一个问题,以获取有关我使用此对象的一些更具体的代码,使用的语句在控制器中,等等。

您的问题与部分无关。我已经在您的另一个问题中解决了问题。这个问题也与异步无关,因为这是自MVC的第一个版本以来,它不支持异步。

您必须将对象传递到方法返回时未处理的视图。

看来您只是对局部和儿童动作之间的区别感到困惑。

部分视图是一些没有布局的HTML。除非您通过其他模型,否则它将继承其父视图的模型。这很可能是您需要使用的:

@Html.Partial("_MyPartialView")

这实际上就是您所需要的。您无需将任何内容添加到控制器中。

现在,儿童行动是不同的。它们就像普通的动作,但在中运行。换句话说,它们无法像普通动作那样通过URL访问,但是它们仍然与主要请求完全分开。它们也可以作为获取。您不会发布儿童操作,这意味着您无法将复杂的数据类型发送到整个模型之类的复杂数据类型。他们的目的是允许您渲染一些不适合页面其余部分的东西。例如,如果您的主要操作和视图的任务是获取单个博客文章的渲染,则您可能仍然需要一个侧栏,显示其他最近的帖子。通过儿童动作,您可以获取最近的帖子列表,并渲染在具有帖子列表的视图中,所有这些都不会影响主视图。

最新更新