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


248

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

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

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

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

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

回答:


283

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

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

行う場合は、必要return View("~/Views/Wherever/SomeDir/MyView.aspx")なビューを返すことができます。


おかげで、これは私が使用するべきソリューションのように聞こえます。別のコントローラーからビューを表示することは可能ですか?これはMVCのいくつかのルールに違反していると思いますか?
dtc

1
上記の状況では、はい、共有フォルダを使用する必要があります。
ジョナサンフリーランド

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

1
説明ありがとうございます。ビューがそのように呼び出されることを知りませんでした。もちろん、共有ディレクトリは完全に機能します:)
dtc

1
私はコントローラーにいなかったので、使用する必要がnew ViewResult { ViewName = "~/Views/Error/Unauthorised.cshtml" };あり、それは機能しました
Nacht

162

以下を使用できます。

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

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


3
MVC 2で動作し、私が扱っている異常な状況に対する最もクリーンなソリューションであることが判明しました。
Todd

3
Resharperはそのリンクをエラーとして報告しますが、引き続き機能します。
CodeMonkeyKing

1
@CodeMonkeyKing-Resharper 7(VS2012)は、としてフォーマットされたパスを正しく識別します"~/Views/Category/NotFound.cshtml"
Richard Ev 2013

注目に値する:このソリューションは、たとえば「/Category/NotFound.Mobile.cshtml」ビューがある場合など、表示モードで動作します。
BenWillkommen

55

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

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

1
RedirectToAction( "ActionOrView"、 "Controller"、null)となるはずです。それ以外の場合、2番目のパラメータはrouteValues
Zoran Pです。

ただしこの場合、Viewソリューションとは異なり、実際にコントローラーでアクションを記述する必要があります。
tobbenb3

@ tobbenb3これは、結果をハードコーディングするよりもはるかに優れたソリューションです。どちらの方法でも、パス文字列を渡すべきではありません。
perustaja

34

試しましたRedirectToActionか?


1
これは、共有フォルダーのビューを望まない人のためのMVCだと思います。他のすべてのソリューション(ダイレクトパスの使用など)の場合、ビューをリファクタリングしようとする人は覚えておく必要がないことに注意してください別のコントローラーでも使用されているため、予期しない動作が発生する
yoel halb

4
リダイレクトせずにいかがですか?
Luckyy 2013年

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

このソリューションはコントローラーでのアクションを必要とし、View(directPath)はアクションなしで出力をレンダリングします。アクションを追加するときは、URLを介して直接アクセスできないようにする必要があります。ブラウザの履歴などにステップが生成されます。しかし、それが私のやり方です。
JanZahradník2014

3
RedirectToActionは、302応答コードをブラウザーに送信します。404 not foundページを表示しようとしている場合、これは適切ではありません。つまり、このソリューションは機能しているように見えますが、検索エンジンを混乱させることになります。
NightOwl888 14

20

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

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

例:

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

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

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

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

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

@Djeroenを見てください
イグナシオキアッツォ2016

5
ビューを返すのではなく、アクションを呼び出します。
0014

何よりも私にとって役に立ちました。
anil shrestha

5

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


それは知らなかった。それは私が将来使うかもしれないもののように思えます。はい、mvc rocks :)
dtc

1

このコードを使用すると、任意のコントローラーを取得できます。

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

翻訳:このコードを使用すると、任意のコントローラーを取得できます:[コード]、よろしく、
ロバートコロンビア

3
このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
Nic3500 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.