MVC Html.Partial or Html.Action

63

我刚开始学习asp.net MVC,请多多包涵。我需要构建一个跨多个视图重复的菜单,哪个更适合这个目的:Html.Action还是Html.Partial


3
没有更多信息,使用 Html.Partial。将您的菜单内容放在一个局部视图中,并使用 @Html.Partial("partialViewName") 调用它。 - MisterIsaak
一个 Action 可能会做很多事情(除了返回视图)。假设您想要计算(记录)每次构建菜单时的次数(或记录请求菜单的人,或请求的菜单类型)。底线是相同的-HTML中的静态菜单 div。但结果却不同。 - LongChalk
2个回答

124

以下是我认为在使用Html.Action或Html.Partial时应遵循的指南:

Html.Partial

  1. 在呈现静态内容时,请使用 Html.Partial
  2. 如果要从发送到主视图的ViewModel中传递数据,则可以使用 Html.Partial

Html.Action

  1. 当您需要从服务器检索其他数据以填充局部视图时,使用 Html.Action

基本上,如果内容是静态的,使用 Html.Partial()。如果是动态的、与模型无关的数据,请使用 Html.Action()。可能会有更多的情况,但这将给您一个关于如何处理的好想法。对于以上类似命名的函数,Html.RenderPartial()Html.RenderAction()是可互换的。


你的解释很好,给你点赞。 - Pamma
请注意,如果应用程序通过多个控制器进行多次循环,则可能会使得对于给定操作发生的情况稍微难以理解,因为Html.Action()返回到一个 - 可能不同的 - 控制器。根据您的实现/依赖关系,这也可能是昂贵的,并且在某些情况下,筛选器可以作为一种替代方案。 - Cornelius
1
+1 对于动态行为的想法有一个简单的原因(对我来说):通过控制器渲染内容意味着它可以独立于包含视图进行渲染。这意味着视图可以先进行渲染,然后如果你想要刷新页面,可以通过向同一个(部分)控制器动作发起 Ajax 调用,并使用结果来刷新容器。 - C.List

68

Html.Partial:在不先触发控制器操作的情况下呈现一个局部视图。参见:局部视图

Html.Action:调用一个控制器操作,它可能返回一个视图/局部视图(也可能不会,它可能会抛出HttpNotFound或返回Json等其他内容)。

你的菜单需要视图模型吗,还是静态的?

如果是静态菜单,Html.Partial将适合你的需求。将静态菜单内容放入部分视图中,并在想要呈现它的位置调用Html.Partial

如果菜单是根据视图模型生成的,则可以使用其中任何一个Html.PartialHtml.Action

使用Html.Partial链接视图模型

public class MenuViewModel {
    // menu data goes here
}

public class GeneralViewModel : MenuViewModel {
    // general view info goes here
}

public ActionResult Index() {
    return View(new GeneralViewModel());
}

// View Code
@model GeneralViewModel
<div>@Html.Partial("_partialName", model)</div>

在这里,我们将完整的视图模型传递给视图,视图调用Partial并将其模型传递给局部视图。

**使用Html.Action分离模型:**

public ActionResult Index() {
    return View(new GeneralViewModel());
}

public ActionResult MenuView() {
    return PartialView(new MenuViewModel());
}

// View Code
@model GeneralViewModel
<div>@Html.Action("MenuView")</div>

这里视图调用了控制器操作MenuView,该操作创建一个新的视图模型并将其传递给局部视图。


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