【问题标题】:When do you use Html.Action over Html.Partial你什么时候使用 Html.Action 而不是 Html.Partial
【发布时间】:2012-09-25 16:44:57
【问题描述】:

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

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

编辑

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

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

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

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

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

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

    对我来说,这归结为 WhatHow

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

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

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

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

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

    【讨论】:

    • 这可能是我不习惯的原因。我用 ajax 获取了大部分的局部视图。我以为我明白,不必在视图模型中使用视图模型,就可以避免采取行动,但似乎在这种情况下,您仍然应该使用局部视图。 pratapreddypilaka.blogspot.ca/2011/11/… 使用 action 的最佳时机似乎是您需要多次使用同一个模型时
    • 由于像 Ajax 这样的技术,它们都是可行的选择。但请记住,子操作是服务器端的,而部分操作是客户端的(以它们访问数据的方式)。在某些情况下,您可能不想公开通过 Ajax 访问某些数据的方法,或者同样,您可能希望使用 Action 来提供嵌入父页面或作为独立页面的灵活性(如果子属性仅被省略)。同样取决于客户端,JavaScript 可能不适用于 Ajax,尽管这个论点对于当今的浏览器选择并不现实。
    【解决方案2】:

    也许举个例子会更清楚。

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

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

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

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

    【讨论】:

    • 对不起。我没有 100% 关注。你说每个动作都需要查询数据库。您是指布局文件需要包含 List 集合的事实,这意味着所有其他视图也需要?
    • 是的。布局文件需要能够将List<string> 传递给部分视图。每个动作都需要从数据库中填充该列表,以便布局可以将列表传递给部分视图。如果您改为使用子操作,则 Layout 类型会向局部视图显示“自己获取数据”,而无需担心。
    【解决方案3】:

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

    子操作 用于创建需要包含业务的可重用 UI 控件或小部件 逻辑。当你使用一个子动作时,它会调用一个动作方法,呈现一个 查看,并将结果注入到响应流中。

    【讨论】:

      【解决方案4】:

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

      请注意,我始终将Html.Action() 与将ChildActionOnlyAttribute 应用于我正在调用的控制器方法一起使用,以便无法通过URL 访问HTML 片段。

      【讨论】:

      • 我编辑了我的问题。我不明白您的意思是“我不想包含在视图模型中”。你能解释一下吗?
      • @chobo2 当然可以。页面上的元素通常不直接与页面的主要内容相关,但仍然是动态的。一个例子是电子商务网站上的购物车侧边栏;您不想将购物车的摘要放入每个视图模型中,因此您可以调用 @Html.Action("Cart") 来加载摘要。
      【解决方案5】:

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

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

      【讨论】:

      • 我想我已经开始明白了,但仍然不是 100%。您不能使用部分视图模型,然后将视图模型包含在另一个视图模型中吗?例如你的菜单创意。当页面加载您将需要一个菜单​​。那么为什么在第一次加载时两次访问服务器只是获取您需要的所有内容并使用部分? pratapreddypilaka.blogspot.ca/2011/11/…
      • 这正是部分的用法。从字面上看,局部视图模型是您发送到页面的视图模型的子集。在编写指示要在何处渲染局部视图的部分时,您将引用您的原始模型,就像 Model.Menu 并将其发送到您的局部视图。操作可能会两次访问服务器,具体取决于它是否需要渲染模型信息。
      【解决方案6】:

      这个问题已得到解答(以及选举在这里选择149次):

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

      更新 抱歉,本来是想把这些帖子发给你的

      希望这会有所帮助。

      【讨论】:

      • 我确实看到了这个,但它似乎真的在谈论 Partial/Action 与 Render Partial/Action 之间的区别,而不是这两种类型之间的区别。
      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 2012-01-19
      • 2020-01-10
      • 1970-01-01
      • 2010-11-16
      • 2012-07-30
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多