13

我仍然没有得到 Html.Action在 asp.net mvc 中的主要目的。Html.Partial每次我需要加载部分视图或想要在视图中拆分一些代码以清理它时,我一直在使用它。

哪里Html.Action适合所有这些(例如,您想在哪里使用Html.Action使用Html.Partial)?

编辑

答案似乎是将 Html.Action 用于动态数据。我不明白这一点,因为您也可以将部分视图用于动态数据。

例如,如果我网站上的用户编辑了一行。对一个方法进行了 ajax 调用,然后我从数据库中获取该行。然后,我返回一个表单的部分视图,其中包含所有数据可供编辑。如果发生错误,我会使用错误方法返回一个 json 结果,我的 javascript 会使用它并提醒用户。

如果一切正常,则将呈现的 html 放入 jquery 对话框并显示给用户。

是不是因为你可以使用“ChildActionOnlyAttribute”让人们改用Action?

4

6 回答 6

12

Ankur 的想法是正确的,但我发现你真的可以进一步简化这个概念。

对我来说,它归结为什么如何

如果您知道渲染的内容但不知道如何渲染,您可能会使用 partial 来决定如何渲染信息。例如,也许您的视图模型用于发票。您的发票视图模型可能已经包含您需要的有关发票本身的所有信息,可能包括发票上的可枚举行项目。对于行项目,部分可能是一个不错的选择,因此它是自包含的。您已经有了订单项详细信息(what),但部分将处理它的呈现方式(how

另一方面,也许您的发票视图模型上有一个客户 ID,但没有实际的客户详细信息。在这里,您没有what,因此您将客户 ID 传递给 Action ,它将获取所需数据并将其传递给视图以呈现看起来合适的方式。

因此,总而言之,如果您已经拥有想要使用的所有数据,只需坚持使用 Partial,但如果您缺少需要获取的信息,Action 会更好。

当局部视图包含通过 Ajax(或其他技术)检索其自己的数据的能力时,边缘变得非常模糊。在这种情况下,您可以在我的示例中将客户详细信息部分设置为 Partial,并让它在客户端获得响应后使用 Ajax 检索所需的数据。但是,如果这种事情对您的实施有意义,那就更取决于您了。

附录: 值得注意的是,如果您决定试用 ASP.NET MVC Core,则 ChildActions 不再可用。在这种情况下,您的选择将仅限于局部视图、ajax 或新引入的组件功能。最后一个类似于 ChildActions,但在实现方式上略有不同。

于 2012-09-25T17:24:34.070 回答
2

也许举个例子可以更清楚地说明这一点。

假设您有一个出现在每个页面上的菜单,因此您将其放入布局中。菜单永远不会改变——只有一些基本的导航链接,主页、关于、联系我们等,所以您只需使用普通的局部视图。这会很好 - 因为内容是静态的 - 你不需要去数据库来获取数据。你可以只使用@Html.Partial("Menu");.

稍后您决定需要更改菜单,以便它从数据库中获取所有链接。您更新您的局部视图以具有一个模型,该模型是一个List<string>- 每个链接的模型。

现在,如果您仍然只想使用部分视图,则每个操作都需要查询数据库以获取链接列表,并且每个视图的每个模型都需要具有List<string>链接的属性,以便它可以传递这个到菜单部分视图。这将是一个坏主意。

相反,您将创建一个新的 Child Action GetMenuLinks()- 这将查询数据库以获取链接作为 a List<string>,并将其传递给 Partial View。这让 Child Action 负责获取它自己的数据。这意味着您只需要在一个地方进行此查询,例如“关于我们”操作不需要担心获取菜单的链接列表。

于 2012-09-25T22:31:14.687 回答
1

部分视图 用于在视图之间共享视图标记的子部分。局部视图可以包含内联代码、HTML 辅助方法以及对其他局部视图的引用。部分视图不调用操作方法,因此它们不能用于执行业务逻辑。

子操作 用于创建需要包含业务逻辑的可重用 UI 控件或小部件。当您使用子操作时,它会调用操作方法、呈现视图并将结果注入响应流。

于 2013-06-22T09:52:22.887 回答
0

This question is answered (and elected for 149 times !) here:

Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction

更新 对不起,本打算向您发送这些帖子,而不是

希望这可以帮助。

于 2012-09-25T18:13:18.267 回答
0

Html.Action()用来加载我不希望包含在视图模型中的动态内容(例如,侧边栏中的用户信息)。它对于保持输入和输出视图模型相同非常有用。

请注意,我总是将Html.Action()与应用ChildActionOnlyAttribute到我正在调用的控制器方法结合使用,这样 HTML 片段就不能通过 URL 访问。

于 2012-09-25T16:56:13.747 回答
0

当您需要视图模型的一个子集来呈现有问题的部分时,请使用 Html.Partial - 通常它与您正在处理的内容有关。如果可以是表单的子部分、与主视图相关的相关内容片段等。部分从父视图接收其模型信息。

否则,请使用 Html.Action 呈现独立于主视图的内容,例如导航片段、旁白或其他干扰。Html.Action 使用其控制器提供的自己的模型,而不是由父视图提供。

于 2012-09-25T18:20:28.500 回答