【问题标题】:RenderAction RenderPartialRenderAction RenderPartial
【发布时间】:2009-04-05 14:43:44
【问题描述】:

据我了解,ASP.NET MVC 版本中包含的 Html.RenderPartial 与 MVC Futures 中 Microsoft.Web.Mvc.ViewExtensions 中的 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 会正确呈现表单。

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

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

RenderActionRenderPartial 之间存在很大差异。 RenderPartial 将在同一个控制器(或共享控制器)上渲染一个 View,而 RenderAction 实际上将执行整个 MVC 循环,即:它将实例化控制器(任何您提到的控制器,而不仅仅是当前的控制器),它将执行操作,然后返回并呈现结果。

RenderPartial 更类似于inclusion,如果您不指定不同的型号,它甚至会共享相同的型号。

RenderAction 要复杂得多(并且可能存在不希望的副作用,这就是为什么他们从版本 1 开始就没有提供此功能 - 最初它是作为实验性功能提供的)。

因此,在您的情况下,如果您有小部件,则可以同时使用两者。这取决于小部件的复杂性。如果你有一个必须从数据库中获取数据、做一些复杂的事情等等......那么你可能应该使用RenderAction

我有一个负责新闻对象的新闻控制器。我创建了一个 Block 动作,它将呈现一个带有最新消息的块,并将其放在主页中。在我看来,这是 RenderAction 的完美示例。

【讨论】:

  • 如果你有一个必须从数据库获取数据、做一些复杂的事情等,那么我仍然可以使用RenderPartial 只需将数据映射到模型属性,检查this,这不是比RenderAction性能更好吗?
  • "RenderPartial 更类似于包含,如果您不指定不同的模型,它甚至会共享相同的模型。" 但是,我们是否必须在子部分视图中明确指定 model 的名称?
【解决方案2】:

使用 MVC 需要非常注意不要在自己的脚下开枪。我的意思是 MVC 产品的效率。在复杂的项目中,我更喜欢使用 RenderPartial 而不是 RenderAction。我使用 RenderPartial,其中使用 jQuery.ajax 请求(使用 Html.Action)。它肯定比 RenderAction 更有效。通过这种方式,您可以将您的视图放入缓存中,然后调用 jQuery.ajax。自己试试。 Ayende 在Hibernating Rhinos 中解释得很清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多