0

据我所知,MVC 似乎对待部分视图不同于主要视图。似乎我可以访问主视图中的对象,但如果该对象将在主控制器操作返回后被释放(请参阅我的问题here),则不能访问它的子视图。

我认为这是为了在主控制器操作中的对象被处置很久之后,通过 AJAX 或其他方法促进这些部分视图的异步更新。这对我来说很有意义。

我现在尝试使用局部视图的方式,我不需要这种异步更新功能。我可以将部分视图全部剪切并放在一起,但我正在寻找的只是一种将我的视图分割成更小的块的方法,而不是将它们全部放在一个大文件中。

理想情况下,我希望能够将一个对象从我的控制器传递到我的视图,在视图和任何子/子视图中使用该对象,并且仅在视图及其子/子视图完成后处理该对象使用它。

编辑 - 添加一个例子

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

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

据我所知,局部视图似乎是这个问题的答案,尽管似乎有很多方法可以使用。我遇到的问题是我的控制器正在将一个对象传递给控制器​​操作返回时释放的视图。

在“all in one file”场景下,我可以成功地利用对象构建完整视图,因为整个视图是在方法返回和对象被释放之前构建的。但是,这并不理想,因为这意味着大型、长、单一的视图文件以及以后可能出现的部分重复。

在“多个文件”场景中,主视图可以正常访问对象,因为它还没有被释放。但是主控制器操作方法在部分视图获得对象之前返回,处理对象。结果是局部视图中出现错误,正在寻找不再可用的对象。

我想要的是一种在控制器方法处理我的对象之前构建由多个有组织的块组成的完整视图的方法。

再次,请参阅我的另一个问题,了解有关我正在使用该对象做什么、它在控制器中的 using 语句等的更具体的代码。

4

2 回答 2

1

您的问题与 Partials 无关。我已经在你的另一个问题中解决了这个问题。这个问题也与异步无关,因为从不支持异步的 MVC 的第一个版本开始就是这样。

您必须将对象传递给方法返回时未释放的对象。

于 2014-02-06T22:43:28.733 回答
1

看来您只是对部分操作和子操作之间的区别感到困惑。

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

@Html.Partial("_MyPartialView")

这就是你所需要的。您根本不需要向控制器添加任何内容。

现在,孩子的行动是不同的。它们就像正常的操作,但主请求中运行。换句话说,它们不像正常操作那样通过 URL 访问,但它们仍然与主请求完全分开. 它们还用作 GET。您不会 POST 到子操作,这意味着您不能像整个模型一样发送复杂的数据类型。它们的目的是允许您呈现与页面其余部分不完全相符的内容。例如,如果您的主要操作和视图的任务是获取单个博客文章的渲染,您可能仍希望有一个显示其他最近文章的侧栏。使用子操作,您可以获取最近的帖子列表并将其呈现在为其模型设置为帖子列表的视图中,所有这些都不会影响主视图。

于 2014-02-06T22:50:59.817 回答