我仍然没有在ASP.NET MVC中获得Html.Action的主要目的。每当需要加载部分视图或想在视图中拆分一些代码以进行清理时,我一直在使用Html.Partial。
Html.Action在哪里适合所有这些(例如,您想在哪里使用Html.Action而不使用Html.Partial)?
编辑
答案似乎是对动态数据使用Html.Action。我不明白这一点,因为您也可以将局部视图用于动态数据。
例如,如果我网站上的用户编辑了一行。对方法进行ajax调用,然后从数据库中获取该行。然后,我返回一个表单的局部视图,该表单上的所有数据均已准备好进行编辑。如果发生错误,则我将使用error方法返回一个json结果,而我的JavaScript会使用它并警告用户。
如果一切正常,则将呈现的html放入jquery对话框中并显示给用户。
是因为可以使用使人们使用Action的” ChildActionOnlyAttribute”代替吗?
Ankur的想法正确,但我发现您可以进一步简化该概念。
对我来说,归结为什么与如何
如果您知道要呈现的内容,但不知道呈现的可能性,则可以使用局部变量来确定如何呈现信息。
例如,也许您的视图模型用于发票。您的帐单视图模型可能已经具有了您需要的有关帐单本身的所有信息,包括发票上的行项目的枚举。对于订单项而言,部分订单可能是一个不错的选择,因为它可以独立存在。您已经有了订单项的详细信息(内容是什么),但是部分订单项将处理如何呈现(如何)
另一方面,也许您的发票视图模型上有一个客户ID,但没有实际的客户详细信息。在这里,您没有内容,因此您可以将客户ID传递给Action,它将获取所需的数据,然后将其传递给视图以呈现看起来合适的数据。
因此,总而言之,如果您已经拥有要使用的所有数据,只需坚持使用Partial,但是如果您缺少需要获取的信息,则Action会更好。
当局部视图包含通过Ajax(或其他技术)检索自己的数据的能力时,这种情况就变得非常模糊。在这种情况下,您也许可以在我的示例中将”客户详细信息”部分设为”部分”,并让其在客户端得到响应后使用Ajax检索所需的数据。但是,如果这种事情对您的实现来说更有意义,则取决于您。
附录:
值得注意的是,如果您决定尝试使用ASP.NET MVC Core,则将不再提供ChildActions。在这种情况下,您的选择将限于局部视图,ajax或新引入的组件功能。最后一个与ChildActions类似,但实现方式略有不同。
这可能就是为什么我不习惯这一切的原因。我用ajax捕获了大部分局部视图。我以为我知道可以不必在视图模型中包含viewmodel来解决问题,但是在这种情况下,您仍然应该使用局部视图。 pratapreddypilaka.blogspot.ca/2011/11/似乎最好的使用时间是在需要多次使用同一模型的情况下
由于采用了Ajax之类的技术,它们都是可行的选择。但是请记住,子操作在服务器端,而子操作在客户端(以它们访问数据的方式)。在某些情况下,您可能不想公开通过Ajax访问某些数据的方法,或者同样地,您可能想使用Action来灵活地嵌入到父页面或独立页面中(如果仅child属性)省略)。同样取决于客户端,JavaScript可能不适用于Ajax,尽管此参数对于当今选择的浏览器而言并不现实。
也许一个例子可以使这一点更加清楚。
假设您有一个菜单显示在每个页面上,因此将其放在布局中。菜单将永远不会改变-只有一些基本的导航链接,”主页”,”关于”,”联系我们”等,因此您只使用普通的局部视图。这将很好地工作-因为内容是静态的-您无需进入数据库即可获取数据。您可以只使用@Html.Partial(“Menu”);。
稍后,您决定需要更改菜单,以便它从数据库中获取所有链接。您更新部分视图以使其模型为List-每个链接一个。
现在,如果您仍然只想使用Partial View,则每个操作都需要查询数据库以获取链接列表,并且每个View的每个Model都需要具有链接的List属性,以便它可以将其传递给菜单部分视图。这将是一个坏主意。
取而代之的是,您将创建一个新的子操作GetMenuLinks()-这将查询数据库以获取链接作为List,并将其传递给”部分视图”。这使Child Action负责获取自己的数据。这意味着您只需要将查询放在一个地方,例如”关于我们”操作就不必担心获取菜单链接列表。
抱歉。我没有100%关注。您说每个动作都需要查询数据库。您是指布局文件需要包含List 集合的事实,这意味着所有其他视图也需要这样做吗?
是。布局文件将需要能够将List传递给Partial View。每个Action都需要从数据库中填充该列表,以便Layout可以将该列表传递给Partial View。如果您改用Child Actions,则Layout这样说的话可以自己将数据获取到局部视图,而无需担心。
部分视图
用于在视图之间共享视图标记的小节。部分视图可以
包含内联代码,HTML帮助器方法以及对其他部分引用
意见。部分视图不会调用操作方法,因此无法使用它们
执行业务逻辑。
儿童行为
用于创建需要包含业务的可重用UI控件或小部件
逻辑。使用子操作时,它会调用一个操作方法,并呈现一个
视图,并将结果注入响应流。
当您需要视图模型的一个子集来渲染相关部分时,请使用Html.Partial -通常,这与您正在处理的内容有关。如果可以是表单的子部分,则它是与主视图相关的相关内容,等等。部分从父视图接收其模型信息。
否则,请使用Html.Action呈现独立于主视图的内容,例如导航片段,旁观者或其他干扰对象。 Html.Action使用其控制器提供的自己的模型,而不是由父视图提供的模型。
我想我已经开始了解它了,但仍然不是100%。您可以不使用局部模型,然后在另一个视图模型中包含一个视图模型吗?例如您的菜单提示。页面加载后,您将需要一个菜单??。那么,为什么要在第一次加载时两次访问服务器,只是获得所需的一切并局部使用? pratapreddypilaka.blogspot.ca/2011/11/
那就是部分用法。从字面上看,部分视图模型是您发送到页面的视图模型的子集。在编写指示要在何处渲染局部视图的片段时,您将引用原始模型,就像Model.Menu一样,并将其发送到局部视图。根据是否需要呈现模型信息,操作可能两次击中服务器。
在这里回答这个问题(并被选出149次!):
Html.Partial与Html.RenderPartial和Html.Action与Html.RenderAction
更新资料
抱歉,是为了向您发送这些帖子,
MVC Html.Partial或Html.Action
@ Html.Partial()与@ Html.Action()-MVC剃刀
希望这可以帮助。
我确实看到了这一点,但它似乎是在真正地谈论Partial / Action与Render Partial / Action之间的区别,而不是两种类型之间的区别。
我使用Html.Action()加载不希望包含在视图模型中的dynaimc内容(例如,边栏中的用户信息)。这对于保持输入和输出视图模型相同非常有用。
请注意,我始终将Html.Action()与将ChildActionOnlyAttribute应用于要调用的控制器方法结合使用,以便无法通过URL访问HTML片段。
我编辑了问题。我不明白您的意思是”我不希望包含在视图模型中”。你能解释一下吗?
@ chobo2好的。通常,页面上的元素并不直接与页面的主要内容相关,而是动态的。一个示例是电子商务网站上的购物车侧栏。您不想将购物车的摘要放入每个视图模型中,因此您调用@Html.Action(“Cart”)来加载摘要。