2009-09-13 12 views
39

ビューからコントローラーインスタンスにアクセスするにはどうすればよいですか?例えば。 HomeControllerがあり、私のIndexビューが返されます。そのビューの内部で、ビューを作成したHomeControllerインスタンスにアクセスしたいとします。それ、どうやったら出来るの?ASP.NET MVC:ビューからコントローラーインスタンスにアクセス

+0

どのようにこれに対する答えが「あなたはしていない」(c.f. https://stackoverflow.com/q/9562214/1739000)ではないのですか? –

答えて

70

ViewContext.Controller、それをキャストする必要があります。

<% var homeController = ViewContext.Controller as HomeController; %> 

これはポストAsp.Net MVC: How do I get virtual url for the current controller/view?でいくつかの余分なしわで覆われています。

EDIT:人間が可能な限り視界から機能を引き離すために、Mark Seemannの提案に肉を追加することです。コントローラーを使用してレンダリングされたページのマークアップを判断する場合は、代わりにHtml.RenderAction(actionName, controllerName)メソッドを使用します。この呼び出しは、アクションが別のリクエストであるかのように起動し、そのビューをメインページの一部として含めます。

このアプローチは、リダイレクトされたアクションメソッドがプレゼンテーションルールに関してすべての重労働を行う可能性があるため、分離の徹底に役立ちます。親ビュー内で正しく動作するには、パーシャルビューを返す必要があります。

+0

それは私が探していたものです。ありがとうございました。 – Alex

+0

@Alex:喜んで –

+0

@David:RenderActionはFuturesパッケージでのみ利用可能ですか? – Alex

28

私の意見では、ビューがコントローラについて知る必要がないデザインを考慮する必要があります。コントローラーは要求を処理し、モデルを作成し、そのモデルをビューに表示します。その時点で、コントローラの作業は完了です。

私は、Viewがコントローラについて何かを知る必要がある場合、それが設計上の欠陥であると考えています。あなたが達成しようとしていることをもっと分かち合うことができますか?

よく設計されたフレームワーク(MVCフレームワークなど)を扱う場合、フレームワークがあなたと戦っているように感じたら、間違った方法で作業することがよくあります。これは私にはたくさん起こりました。そして、私が実際に達成しようとしていることは、新しい歩みにつながります。

+1

+1。ユーティリティクラスが必要な場合は、通常、コントローラのライフサイクルが「戻る」で終わる必要があるため、ViewModelまたは完全に別のエンティティに移動する必要があります。 –

+0

Mark:あなたの議論に自分の投稿に少し追加しました。 +1 –

+0

+1も私から。私はこれについて考えました。私がやっていることは、ASP.NET MVCの通常のスタータープロジェクトからのLogOnUserControlに似た部分的なビューがあることです。ユーザー名を表示します(しかし、ページコンテキスト/ IPrincipalからのものではありません - カスタムです)。私のコントローラには既にユーザー名を提供できるサービスがあります。そのため、ビューで再インスタンス化するのではなく、コントローラからインスタンスを取得したいと思います。私はモデルを使用していません。なぜなら、定期的な戻りView()を利用して問題に遭遇したくないからです(これは共有されているので、VMベースクラスなどが必要です)。 – Alex

関連する問題