我仍然没有在asp.net mvc中获得Html.Action
的主要目的。每次我需要加载局部视图或想要在视图中拆分一些代码来清理它时,我一直在使用Html.Partial
。
Html.Action
适合所有这些(例如,您希望在哪里使用Html.Action
而不使用Html.Partial
)?
修改
答案似乎是使用Html.Action来获取动态数据。我没有这个,因为你也可以使用动态数据的部分视图。
例如,如果我网站上的用户编辑了一行。对方法进行ajax调用,然后从db中获取该行。然后,我返回一个表格的parital视图,其中包含所有数据,可以进行编辑。如果发生错误,那么我使用错误方法返回json结果,我的javascript使用它并提醒用户。
如果一切正常,则将渲染的html放入jquery对话框并显示给用户。
是因为你可以使用“ChildActionOnlyAttribute”来让人们使用Action吗?
答案 0 :(得分:12)
Ankur有正确的想法,但我发现你可以真正进一步简化这个概念。
对我来说,它归结为什么与如何
如果您知道 要渲染但不 ,则可能会使用partial来让它确定如何呈现信息。 例如,您的视图模型可能是发票。您的发票视图模型可能已包含有关发票本身的所有信息,包括发票上可能包含的可用行项目。部分可能是订单项的不错选择,因此它是自包含的。您已经有了订单项详细信息(内容),但是部分内容会处理它的呈现方式(如何)
另一方面,您的发票视图模型可能包含客户ID,但没有实际的客户详细信息。在这里,你没有什么,所以你将客户ID传递给一个Action,它将获得所需的数据并将其传递给查看以显示如何。
总而言之,如果您已经拥有了想要使用的所有数据,只需坚持使用Partial,但如果您缺少需要获取的信息,那么Action会更好。
当边缘变得非常模糊时,部分视图包括通过Ajax(或其他技术)检索自己的数据的能力。在这种情况下,您可以在我的示例中创建客户详细信息部分,即Partial,并在客户端获得响应后使用Ajax检索所需的数据。但是,如果这种事情对你的实施有意义,那就更取决于你了。
<强>附录:强> 值得注意的是,如果您决定尝试使用ASP.NET MVC Core,则不再提供ChildActions。在这种情况下,您的选择将仅限于部分视图,ajax或Components新引入的功能。最后一个类似于ChildActions,但实现方式略有不同。
答案 1 :(得分:2)
也许一个例子会让这个更清楚。
假设您有一个菜单显示在每个页面上,因此您将其放入布局中。菜单永远不会改变 - 只有一些基本的导航链接,主页,关于,联系我们等,所以你只需使用正常的局部视图。这样可以正常工作 - 因为内容是静态的 - 您不需要去数据库来获取数据。您可以使用@Html.Partial("Menu");
。
稍后您决定需要更改菜单,以便从数据库中获取所有链接。您更新部分视图以使模型为List<string>
- 每个链接一个。
现在,如果您仍想使用部分视图,则每个操作都需要查询数据库以获取链接列表,并且每个视图的每个模型都需要具有List<string>
属性。链接,以便它可以将其传递给菜单部分视图。这将是个坏主意。
相反,您将创建一个新的Child Action GetMenuLinks()
- 这将查询数据库以获取List<string>
的链接,并将其传递给Partial View。这使得Child Action负责获取自己的数据。这意味着您只需要在一个地方进行此查询,例如“关于我们”操作无需担心获取菜单的链接列表。
答案 2 :(得分:1)
部分观点 用于在视图之间共享视图标记的子部分。部分观点可以 包含内联代码,HTML帮助程序方法和对其他部分的引用 观点。部分视图不会调用操作方法,因此无法使用它们 执行业务逻辑。
儿童行动 用于创建需要包含业务的可重用UI控件或窗口小部件 逻辑。当您使用子操作时,它会调用一个操作方法,然后呈现一个 查看,并将结果注入响应流。
答案 3 :(得分:0)
我使用Html.Action()
加载我不希望在视图模型中包含的dynaimc内容(例如,侧边栏中的用户信息)。它对于保持输入和输出视图模型相同非常有用。
请注意,我总是将Html.Action()
与将ChildActionOnlyAttribute
一起应用于我正在调用的控制器方法,以便无法通过URL访问HTML片段。
答案 4 :(得分:0)
这个问题已经回答了(选出了149次!):
Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction
<强>更新强> 对不起,打算发送这些帖子而不是
希望这有帮助。
答案 5 :(得分:0)
当您需要视图模型的子集来呈现相关部分时,请使用Html.Partial - 通常它与您正在处理的部分有关。如果可以是表单的子部分,与主视图等相关的相关内容部分。部分从父视图接收其模型信息。
否则使用Html.Action呈现独立于主视图的内容,例如导航片,旁边或其他干扰。 Html.Action使用由其控制器提供的自己的模型,而不是由父视图提供。