異なるコントローラのアクションメソッド間でデータを受け渡しする
質問
私は
ASP.NET MVC 4
. あるコントローラから別のコントローラにデータを渡そうとしています。 私はこれを正しく理解していません。 私はこれが可能であるかどうかわからないのですか?
データを渡したいソースアクションメソッドはこちらです。
public class ServerController : Controller
{
[HttpPost]
public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
{
XDocument updatedResultsDocument = myService.UpdateApplicationPools();
// Redirect to ApplicationPool controller and pass
// updatedResultsDocument to be used in UpdateConfirmation action method
}
}
このコントローラのこのアクションメソッドに渡す必要があります。
public class ApplicationPoolController : Controller
{
public ActionResult UpdateConfirmation(XDocument xDocument)
{
// Will add implementation code
return View();
}
}
の中で以下を試してみました。
ApplicationPoolsUpdate
アクションメソッドで以下を試してみましたが、うまくいきません。
return RedirectToAction("UpdateConfirmation", "ApplicationPool", new { xDocument = updatedResultsDocument });
return RedirectToAction("UpdateConfirmation", new { controller = "ApplicationPool", xDocument = updatedResultsDocument });
どうすれば実現できるのか?
どのように解決するのですか?
HTTPとリダイレクト
まず、ASP.NET MVCがどのように動作するかをおさらいしましょう。
- HTTPリクエストが来ると、それはルートのセットと照合されます。ルートがリクエストにマッチした場合、ルートに対応するコントローラのアクションが呼び出されます。
- アクションメソッドを呼び出す前に、ASP.NET MVCはモデルバインディングを実行します。モデルバインディングとは、基本的にテキストであるHTTPリクエストの内容を、アクションメソッドの強くタイプされた引数にマッピングする処理です。
リダイレクトが何であるかも思い出してみましょう。
HTTP リダイレクトとは、ウェブサーバがクライアントに送ることのできる応答で、要求されたコンテンツを別の URL で探すようにクライアントに伝えるものです。新しい URL は
Location
ヘッダーに含まれ、ウェブサーバーがクライアントに返します。ASP.NET MVCでは、HTTPリダイレクトを行うには、Webサーバーが返す
RedirectResult
をアクションから返すことでHTTPリダイレクトを行います。
データの受け渡し
文字列や整数のような単純な値を渡すだけなら、URL のクエリパラメータとして
Location
ヘッダで渡すことができます。これは、次のようなものを使用した場合に起こります。
return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });
他の人が提案したように
これがうまくいかないのは
XDocument
が非常に複雑なオブジェクトである可能性があるからです。ASP.NET MVC フレームワークには、ドキュメントを URL に収まるようにシリアライズして、URL の値からモデルバインディングして
XDocument
アクション パラメータにモデルバインディングします。
一般に、ドキュメントをクライアントに渡して、クライアントが次のリクエストでそれをサーバーに返すというのは、非常にもろい手順です:あらゆる種類のシリアライズとデシリアライズが必要で、あらゆる種類のことがうまくいかない可能性があります。ドキュメントが大きい場合、帯域幅のかなりの浪費になり、アプリケーションのパフォーマンスに深刻な影響を与える可能性があります。
代わりに、あなたがしたいことは、サーバー上でドキュメントを維持し、クライアントに識別子を返すことです。クライアントは次のリクエストでこの識別子を渡し、サーバーはこの識別子を使用してドキュメントを取得します。
次のリクエストで取得するためのデータを保存する
さて、ここで問題になるのは、その間にサーバーがドキュメントをどこに保存するかということです。まあ、それはあなたが決めることで、最適な選択はあなたの特定のシナリオに依存します。このドキュメントが長期的に利用可能である必要がある場合、ディスクまたはデータベースに保存することをお勧めします。一時的な情報しか含まれていない場合は、Webサーバーのメモリ、ASP.NETのキャッシュ、または
Session
(または
TempData
というように、多かれ少なかれ
Session
と同じです) が正しい解決策かもしれません。いずれにせよ、後でドキュメントを取得できるようなキーの下にドキュメントを保存するのです。
int documentId = _myDocumentRepository.Save(updatedResultsDocument);
で、そのキーをクライアントに返します。
return RedirectToAction("UpdateConfirmation", "ApplicationPoolController ", new { id = documentId });
ドキュメントを取得したいときは、単純にキーを元に取得します。
public ActionResult UpdateConfirmation(int id)
{
XDocument doc = _myDocumentRepository.GetById(id);
ConfirmationModel model = new ConfirmationModel(doc);
return View(model);
}
関連
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み] 2つのリストを結合する
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
-
[解決済み] ASP.NET Identity - HttpContextにはGetOwinContext用の拡張メソッドがありません。
-
[解決済み】ASP.NET MVCでクライアントのIPアドレスを取得するにはどうすればいいですか?
-
[解決済み] [Solved] ASP.NET MVCコントローラメソッドからJSON.NETでシリアライズされたcamelCase JSONを返すにはどうすればよいですか?
-
[解決済み】ViewModelのベストプラクティス
-
[解決済み】ベースコントローラのOnActionExecutingからリダイレクトする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] 2つのリストを結合する
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する