2009-05-18 21 views
207

別のコントローラからビューを表示することはできますか?ASP.NET MVCの別のコントローラからビューを表示

は、例えば、私がCategoriesControllerCategory/NotFound.aspxビューを持っていると言います。 CategoriesControllerでは、私はeasly返すことができますView("NotFound")

は今、私は製品を追加するProductsControllerとアクションとビューを持っていると言います。ただし、この操作では、製品を追加するカテゴリが必要です。たとえば、Products/Add/?catid=10となります。

私はcatidに基づき区分を見つけることができないのですが、私が代わりに製品のコントローラの下CategoryNotFoundビューを作成するカテゴリーコントローラからNotFoundビューを表示したいです。

これは可能ですか、間違った方法で構造化していますか?これを行う良い方法はありますか?

答えて

229

はい。デフォルトでは、ASP.NET MVCは最初に\Views\[Controller_Dir]\をチェックしますが、その後にビューが見つからない場合は\Views\Sharedをチェックします。

共有ディレクトリは、複数のコントローラ間でビューを共有するためのものです。共有サブディレクトリにビューを追加するだけでよいのです。

あなたがreturn View("~/Views/Wherever/SomeDir/MyView.aspx")をすればあなたは、あなたが好きなすべてのビューを返すことができます。

+0

ありがとう、これは私が使用しなければならないソリューションのように聞こえる。 私はまだ別のコントローラからビューを表示することが可能かどうか疑問に思う。私はこれがMVCのいくつかのルールに違反していると思いますか? – dtc

+1

上記の状況では、はい、Sharedフォルダを使用する必要があります。 –

+65

これも可能です。あなたがしている場合 戻るビュー( "〜/ Views/Wherever/SomeDir/MyView.aspx") あなたが望む任意のビューを返すことができます。これは特定のルールそのものに違反するものではありませんが、ASP.Net MVCはすべて、 "congfigurationに関する規則"に関するものです。つまり、フレームワークは特定の規則を使用して自動的に動作するように構築されており、可能な限り利用する必要があります。 – womp

5

またJavaScript/jQueryから任意のコントローラを呼び出すことができます。 404やその他のユーザコントロール/ページを返すコントローラがあるとします。次に、あなたのクライアントコードからいくつかのアクションでコントローラを起動し、結果をHTMLフォーマット に返すことができます。クライアントコードはこの返された結果を受け取り、あなたのページのどこにでも置くことができます。

+0

私はしませんでしたことを知っている。それは私が将来使用するかもしれないもののように聞こえる。はい、mvc rocks :) – dtc

146

あなたは使うことができますか?

+3

MVC 2で動作し、私が扱っている異常な状況のための最もクリーンな解決策であることが判明しました。 –

+3

mvc1でも動作します –

+3

Resharperはそのリンクをエラーとして報告しますが、それでも動作します。 – CodeMonkeyKing

31

2.あなたがRedirectToActionを試してみました

return View("../Category/NotFound", model); 

それは、ASP.NET MVC 3で試験したが、また、ASP.NET MVCで動作するはずです:

+1

私はこれがビューをintにしたくない人のためのMVCだと言いたいのですが、他のすべてのソリューション(ダイレクトパスの使用など)他のコントローラでも使用されているため、ビューが予測できない動作をする可能性があることに注意する必要はありません。 –

+3

リダイレクトしないでください。 – Luckyy

+0

ビューを共有フォルダに移動するよりも優れたソリューション – juFo

27

はい可能です。このようRedirectToAction()メソッドを返し :

return RedirectToAction("ActionOrViewName", "ControllerName"); 
+1

これはRedirectToAction( "ActionOrView"、 "Controller"、null)としてください。それ以外の場合、2番目のパラメータはrouteValuesです –

13

はい、できます。

return RedirectToAction("View", "Name of Controller"); 

例:このようなアクションを返し

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees"); 

このアプローチはまた、あなたがこのようなアクションに値を渡すことができGETメソッド

呼び出します。

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended"); 
+0

このアプローチでオブジェクトを送信するにはどうすればよいですか? – Djeroen

+0

見てください@Djeroen –

+2

あなたはビューを返さず、あなたは行動を呼び出しています。 – 0014

関連する問題