RenderAction RenderPartial

时间:2009-04-05 14:43:44

标签: asp.net-mvc

根据我的理解,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会正确地呈现表单。

2 个答案:

答案 0 :(得分:78)

很老,但它跳进了我未回答的问题列表:)

RenderActionRenderPartial之间存在很大差异。 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中清楚地解释了这一点。