MVC 3中"return View()"和"return PartialView()"有什么区别?

4

所以有人问了我这个问题:

什么时候应该使用 return View(),什么时候应该使用 return PartialView()?

我最初的反应是,如果它是一个局部视图,就使用 PartialView()。然后我意识到,我经常为没有明显不良影响的局部视图返回 View()。那么 return PartialView() 的调用有什么意义呢?

我在这里找到了这个问题。这似乎是特定于MVC2的。也就是说,谈论到.aspx.ascx控件扩展名。在Razor中,我们所有的视图都是.cshtml,无论它们是否是局部视图。

这让我想,PartialView() 只是MVC2的陈旧作法,在MVC3+(使用Razor)中并不适用吗?还是我错过了 PartialView() 的一些关键功能?


https://dev59.com/52Mk5IYBdhLWcg3w5R2k#18873011 - archil
2个回答

7

简而言之: PartialView()不使用视图中的布局。


您可以在_ViewStart.cshtml(位于Views文件夹中)中设置默认布局文件,然后所有视图都将使用它。这样做可以避免在每个视图中设置Layout属性。 PartialView()将不包括该布局文件或其他任何内容。

如果要返回部分视图,例如在使用@Html.Action(action, controller)调用的子操作中,请使用PartialView。如果要返回包含布局的“完整”视图,请使用View()


并没有真正回答我的问题。我的布局通常在视图中声明。我看不到为什么我不能在 @Html.Action 中返回 View?如果我这样做,什么都不会出错吧? - Liam
1
@Liam,你在问题中没有提到@Html.Action,所以我指出了这两种方法在处理布局文件方面的区别。 - Marius Schulz
1
“或者我错过了PartialView()的一些关键特性吗?” 是的,你错过了。视图不应该知道它们正在使用哪个布局,否则它们就不是可重用的。 - Erik Philips

5

MSDN参考:

如果您将ViewResult()对象的MSDN定义与PartialViewResult()对象的MSDN定义进行对比,您会发现唯一的区别在于ViewResult具有一个额外的属性:

public string MasterName { get; set; }

否则,两个对象都继承自ViewResultBase,并似乎从基类继承了所有其他属性和方法。
不幸的是,抽象方法ExecuteResult()的实现没有公布,但我毫不怀疑它使用MasterName字段来查找和渲染主元素层。

我们的共同经验:

就像您一样,我返回部分视图 = 使用View()。我不建议这样做,但表面上的区别不大。

似乎将有一个额外的对象只为了MasterName而存在有点浪费,但更重要的区别可能是ExecuteResult()的实现。

当您选择View()方法并创建ViewResult对象而不是使用PartialView()创建PartialViewResult对象时,您的效率较低;您的应用程序正在执行额外的工作,以检查您的MasterName字段是否被分配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接