2009-12-13 14 views
6

HtmlHelperオブジェクトのRenderAction拡張メソッドを使用して、サイドバーなどをページにレンダリングすることができます。コントローラ上の別の方法で抽象コントローラベースを使用して、デフォルトの「サイドバー戦略」を定義することができます。この戦略は、必要に応じて具体的なコントローラのメソッドをオーバーライドすることで洗練されます。Html.RenderAction()に似ていますが、コントローラオブジェクトを再インスタンス化しない

このアプローチで唯一の「問題」は、すでに動作しているコントローラからアクションをレンダリングする場合でも、コントローラークラスのニュースインスタンスを常に作成する方法で組み込まれていることです。一部のコントローラでは、Initializeメソッドでデータ検索を行い、ビュー内でRenderActionメソッドを使用すると、同じ要求でこれが何度も発生します。

RenderActionには、呼び出されるアクションメソッドが「親」アクションと同じコントローラクラスにある場合、コントローラオブジェクトを再利用する代替手段がありますか?

+0

なぜこれがあなたのための問題ですか?あなたは時期尚早な最適化をしないでください? – queen3

+0

@ queen3:おそらく、それは疑問ではありません:) –

答えて

1

コントローラの[ActionName]と呼ぶことができます。

例:ホームコントローラのAboutアクションメソッドのthis.Index()は、コントローラの初期化をやり直すことなく、インデックスビューをレンダリングします。しかし、これは全体のページでしか機能しません。

renderPartialがうまくいくはずですが、 "要素"(サイドバーなど)が親のビューモデルに必要なすべてのデータを持っていることを確認する必要があります。

たとえば、RenderPartial( "SideBars"、ViewData.Model)。 ViewModelにパーシャルに必要なものがすべて含まれている場合は、共有ビューの先頭に追加することができ、コントローラは最初のViewMoelだけを設定するだけで済みます。

優しさ、

ダン

+0

'RenderPartial()'ではビューがサイドバーに含める部分ビューを明示し、コントローラはこの部分的な前景のデータを提供する必要があります。 'RenderAction()'を使うと、コントローラはサイドバーに何が入るのかを判断し、サイドバーに必要なデータアクセスはこの決定が下されるまで延期することができます。両方のメソッドにはユースケースがありますが、私がしようとしていることについては、 'RenderAction()'が最適だと思います。 –

関連する問題