根据我的理解,ASP.NET MVC版本中包含的Html.RenderPartial
与MVC Futures中包含的HTML.RenderAction
中的Microsoft.Web.Mvc.ViewExtensions
之间存在很大差异。
在我的应用程序中,我有许多页面由许多“小部件”(某种类型)组成,每个小部件都有自己的特定功能。
在我看来使用RenderAction
方法更合理,因为每个小部件都有一个专用控制器,负责获取不同的数据并呈现专用视图(而不是只有一个控制器和一个独特的视图模型)传递给RenderPartial
助手来渲染视图)。
从测试中我已经完成了一个指向控制器中的Create动作方法的表单,如:
<% using (Html.BeginForm("Create", "Message", FormMethod.Post,
new { id = "messageCreateForm" })) {%>
并用
调用它 <% Html.RenderPartial("MessageForm",new MessageDTO()); %>
将正确呈现:
<form id="messageCreateForm" method="post" action="/Message/Create">
但与RenderAction
具有相同的等价物(因此在控制器上使用MessageForm
操作方法来渲染视图)将无法正确渲染:
<% Html.RenderAction<MessageController>(m => m.MessageForm()); %>
将呈现:
<form id="messageCreateForm" method="post" action="">
请注意,操作为空。
这是使用RenderAction
帮助程序的正确方法吗?在这种情况下使用它是否正确?
更新: 实际上,将部分视图重命名为_MessageForm会正确地呈现表单。
答案 0 :(得分:78)
很老,但它跳进了我未回答的问题列表:)
RenderAction
和RenderPartial
之间存在很大差异。 RenderPartial
将在同一个控制器(或共享控制器)上呈现 View
,而RenderAction
将实际执行整个MVC周期,即:将实例化控制器(你提到的任何控制器,而不仅仅是当前控制器),它将执行操作,然后它将返回并呈现结果。
RenderPartial
更类似于inclusion
,如果您未指定其他模型,它甚至会共享相同的模型。
RenderAction
要复杂得多(并且可能会产生不良副作用,这就是为什么他们从版本1开始就没有提供此功能的原因 - 最初它可用作实验性功能)。
所以在你的情况下,如果你有小部件,可以同时使用它们。这取决于小部件的复杂性。如果你有一个必须从数据库获取数据,做一些复杂的事情......等等你应该使用RenderAction
。
我有一个负责新闻对象的新闻控制器。我创建了一个Block动作,它将呈现一个块,其中包含要放入主页的最新消息。在我看来,对于RenderAction来说,这是一个很好的例子。
答案 1 :(得分:1)
使用MVC需要注意不要在脚下射击自己。我的意思是MVC产品的效率。在复杂的项目中,我更喜欢使用RenderPartial而不是RenderAction。我使用RenderPartial,其中我使用jQuery.ajax请求(使用Html.Action)。它肯定比RenderAction更有效。通过这种方式,您可以将您的视图放入缓存,然后调用jQuery.ajax。自己尝试一下吧。 艾恩德在Hibernating Rhinos中清楚地解释了这一点。