web-dev-qa-db-ja.com

ASP.NET MVCで他のコントローラーからのビューを表示する

他のコントローラからのビューを表示することは可能ですか?

たとえばCategoriesControllerビューとCategory/NotFound.aspxビューがあるとします。 CategoriesControllerにいる間、私は簡単にView("NotFound")を返すことができます。

ProductsControllerと、商品を追加するためのアクションとビューがあるとします。ただし、この操作には、商品を追加するカテゴリが必要です。たとえば、Products/Add/?catid=10です。

catidに基づいてカテゴリを見つけることができない場合は、Productsコントローラの下にNotFoundビューを作成するのではなく、CategoriesコントローラからCategoryNotFoundビューを表示します。

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

230
dtc

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

共有ディレクトリは、特に複数のコントローラ間でビューを共有するためにあります。 ViewをSharedサブディレクトリに追加するだけで、問題ありません。

return View("~/Views/Wherever/SomeDir/MyView.aspx")を実行した場合あなたはあなたが望む任意のビューを返すことができます。

259
womp

あなたが使用することができます:

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

ASP.NET MVC 3でテストされていますが、ASP.NET MVC 2でも動作するはずです。

157
Guillaume86

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

return RedirectToAction("ActionOrViewName", "ControllerName");
44
doncadavona

RedirectToActionを試しましたか?

33
Paul Johnson

はい、できます。このようなアクションを返します:

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

例:

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

このアプローチはGETメソッドを呼び出します

また、次のようにアクションに値を渡すこともできます。

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

JavaScript / jQuery から任意のコントローラを呼び出すこともできます。 404または他のユーザーコントロール/ページを返すコントローラがあるとします。それから、何らかのアクションで、あなたのクライアントコードから、あなたはあなたのコントローラを起動しそして HTML というフォーマットで結果を返すアドレスを呼び出すことができます。あなたのページにあなたが欲しい...

5
Marko

このコードを使えば、どんなコントローラでも入手できます。

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, 
controller);
0
Yair GR