2009-04-05 8 views
45

ASP.NET MVCリリースに含まれているHtml.RenderPartialとMVC Futuresに含まれているMicrosoft.Web.Mvc.ViewExtensionsHTML.RenderActionには大きな違いがあります。RenderAction RenderPartial

私のアプリケーションでは、それぞれ独自の機能を持つ多くの「ウィジェット」(並べ替え)から構成されるページが多数あります。

RenderActionメソッドを使用する方がより合理的であるように見えました。各ウィジェットは異なるデータを取得し、専用ビューをレンダリングする責任があります(コントローラとユニークなビューモデルをRenderPartialビューをレンダリングするヘルパー)。

<% using (Html.BeginForm("Create", "Message", FormMethod.Post, 
    new { id = "messageCreateForm" })) {%> 

とcorreclyレンダリングします

<% Html.RenderPartial("MessageForm",new MessageDTO()); %> 

でそれを呼び出す:私のようなコントローラにアクションを作成する方法を指すフォームを持つ行っているテストから

<form id="messageCreateForm" method="post" action="/Message/Create"> 

しかし、RenderActionと同等である(したがってcorreclyそうレンダリングない)ビューをレンダリングするコントローラでアクションメソッド:

<% Html.RenderAction<MessageController>(m => m.MessageForm()); %> 

がでレンダリングされます:アクションが空であることを

<form id="messageCreateForm" method="post" action=""> 

注意。

これはRenderActionヘルパーを使用する正しい方法ですか、そのような場合に使用するのは正しいですか?

更新: 実際に部分ビューの名前を_MessageFormに変更すると、フォームが確実にレンダリングされます。

+1

私はこの件に関する投稿をhttp://prideparrot.com/blog/archive/2012/10/renderpartial_vs__renderactionに作成しました。誰かがこのスレッドを手伝ってくれるでしょう – VJAI

答えて

75

非常に古いもの、それは未回答の質問:)

RenderActionRenderPartialの間には大きな違いがあるの私のリストに飛び込みました。 RenderActionは、実際にはMVCのサイクル全体を実行します。つまり、コントローラ(現在のコントローラーだけでなく、あなたが言及しているコントローラー)もインスタンス化します。は、同じコントローラー(または共有のコントローラー)にViewをレンダリングします。アクションを実行し、結果を返してレンダリングします。

inclusionと似ていますが、別のモデルを指定しなくても同じモデルを共有します。

RenderActionははるかに複雑です(そして、この機能がバージョン1以降に利用可能にならなかった理由は、望ましくない副作用があるかもしれません - 最初は実験的な機能として利用可能でした)。

あなたの場合、ウィジェットをお持ちの場合は、両方を使用しても問題ありません。ウィジェットの複雑さによって異なります。あなたがDBからデータを取得しなければならないものがあれば、何か複雑な作業をしてください...おそらくRenderActionを使うべきです。

私はニュースオブジェクトを担当するニュースコントローラを持っています。ブロックアクションを作成しました。ブロックアクションは、最新のニュースをブロックにレンダリングしてホームページに表示します。これは私の意見では、RenderActionの完璧な例です。

+0

DBからデータを取得する必要がある場合は、何か複雑な作業をしてください。それでもModelプロパティ**にデータをマップするだけで 'RenderPartial'を使うことができます。 (http://stackoverflow.com/a/17627843/2218697)、これは 'RenderAction'よりもパフォーマンスが優れていませんか? – stom

1

MVCを使って作業することは、足で自分を撃たないように注意する必要があります。私は、MVC製品の効率によってそれを意味します。複雑なプロジェクトでは、RenderActionではなくRenderPartialを使用することをお勧めします。私はjQuery.ajaxリクエスト(Html.Actionで)を使用するRenderPartialを使用します。間違いなくRenderActionよりも効率的に動作します。この方法でビューをキャッシュに入れ、jQuery.ajaxを呼び出すことができます。自分で試してみてください。 アヘンデはそれをHibernating Rhinosで明確に説明しています。