1. ホーム
  2. c#

異なるコントローラのアクションメソッド間でデータを受け渡しする

2023-09-28 10:57:06

質問

私は 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がどのように動作するかをおさらいしましょう。

  1. HTTPリクエストが来ると、それはルートのセットと照合されます。ルートがリクエストにマッチした場合、ルートに対応するコントローラのアクションが呼び出されます。
  2. アクションメソッドを呼び出す前に、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);
 }