RenderAction RenderPartial

47
据我所了解,ASP.NET MVC版本中包含的Html.RenderPartial和MVC Futures中的HTML.RenderAction有很大的区别。
在我的应用程序中,每个页面都由许多“小部件”(类似于)组成,每个小部件都有自己特定的功能。使用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="">
请注意,这个 action 是空的。
这是使用 RenderAction 辅助程序的正确方式吗?在这种情况下使用它是否正确?
更新: 事实上,将部分视图重命名为 _MessageForm 可以正确渲染表单。

1
我在这个主题上创建了一个帖子,链接在这里http://prideparrot.com/blog/archive/2012/10/renderpartial_vs__renderaction。希望能帮助到访问此线程的人。 - VJAI
2个回答

81

这是一个很老的问题,但它跳到了我的未回答问题列表中 :)

RenderActionRenderPartial有很大的区别。 RenderPartial将在同一控制器(或共享控制器)上呈现视图,而RenderAction将实际执行整个MVC周期,即:它将实例化控制器(任何你提到的控制器,而不仅仅是当前控制器),执行操作,然后返回并呈现结果。

RenderPartial更类似于包含,如果您没有指定不同的模型,它甚至会共享相同的模型。

RenderAction要复杂得多(可能会有不希望出现的副作用,这就是为什么从版本1开始他们没有使该功能可用 - 最初它只是作为一个实验性功能)。

因此,在您的情况下,如果您有小部件,可以使用两者。这取决于小部件的复杂程度。如果您有一个必须从数据库获取数据,执行某些复杂操作等功能的小部件,则应该使用RenderAction

我有一个名为News的控制器负责新闻对象。我创建了一个Block操作,它将呈现一个包含最新新闻的块,以放置在主页上。在我看来,这是使用RenderAction的完美示例。


如果您有一个需要从数据库获取数据、执行复杂操作等的情况,那么我仍然可以通过将数据映射到模型属性来使用RenderPartial,请参考这里,这难道不比RenderAction更好吗? - Shaiju T
RenderPartial更类似于一个包含,如果您没有指定不同的模型,它甚至会共享相同的模型。然而,在子部分视图中,我们是否必须明确指定“model”的名称? - Sujoy

1

使用MVC需要非常注意,以免自己给自己惹麻烦。我是指MVC产品的效率。在复杂项目中,我更喜欢使用RenderPartial而不是RenderAction。我使用RenderPartial,在其中使用jQuery.ajax请求(带有Html.Action)。它绝对比RenderAction更有效。通过这种方式,您可以将视图放入缓存,然后调用jQuery.ajax。自己尝试一下吧。 Ayende在Hibernating Rhinos中清楚地解释了这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接