76

私はを使用して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 });

どうすればこれを達成できますか?

4

5 に答える 5

76

HTTPとリダイレクト

まず、ASP.NETMVCがどのように機能するかを要約します。

  1. HTTPリクエストが着信すると、一連のルートと照合されます。ルートがリクエストに一致すると、ルートに対応するコントローラーアクションが呼び出されます。
  2. アクションメソッドを呼び出す前に、ASP.NETMVCはモデルバインディングを実行します。モデルバインディングは、HTTPリクエストのコンテンツ(基本的には単なるテキスト)を、アクションメソッドの強く型付けされた引数にマッピングするプロセスです。

また、リダイレクトとは何かを思い出してみましょう。

HTTPリダイレクトは、Webサーバーがクライアントに送信できる応答であり、別のURLで要求されたコンテンツを探すようにクライアントに指示します。新しいURLはLocation、Webサーバーがクライアントに返すヘッダーに含まれています。RedirectResultASP.NET MVCでは、アクションからを返すことでHTTPリダイレクトを実行します。

データの受け渡し

文字列や整数などの単純な値を渡すだけの場合は、LocationヘッダーのURLでクエリパラメータとして渡すことができます。これはあなたが次のようなものを使用した場合に起こることです

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);
 }
于 2014-08-08T10:42:15.740 に答える
66

ASP.NET MVC TempDataを使用してみましたか?

ASP.NET MVC TempDataディクショナリは、コントローラーアクション間でデータを共有するために使用されます。TempDataの値は、読み取られるまで、または現在のユーザーのセッションがタイムアウトするまで持続します。TempDataにデータを永続化することは、単一のリクエストを超えて値が必要な場合のリダイレクトなどのシナリオで役立ちます。

コードは次のようになります。

[HttpPost]
public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
{
    XDocument updatedResultsDocument = myService.UpdateApplicationPools();
    TempData["doc"] = updatedResultsDocument;
    return RedirectToAction("UpdateConfirmation");
}

そして、ApplicationPoolControllerで:

public ActionResult UpdateConfirmation()
{
    if (TempData["doc"] != null)
    {
        XDocument updatedResultsDocument = (XDocument) TempData["doc"];
            ...
        return View();
    }
}
于 2013-03-13T15:08:22.640 に答える
11

個人的にはTempDataを使用するのは好きではありませんが、ASP.Net-MVCのコントローラー間での情報の受け渡しで説明されているように、強く型付けされたオブジェクトを渡すことを好みます。

あなたは常にそれを明確で期待されるようにする方法を見つけるべきです。

于 2013-03-13T12:53:32.333 に答える
5

私は代わりにこれを使用することを好みますTempData

public class Home1Controller : Controller 
{
    [HttpPost]
    public ActionResult CheckBox(string date)
    {
        return RedirectToAction("ActionName", "Home2", new { Date =date });
    }
}

そしてもう一つcontroller Action

public class Home2Controller : Controller 
{
    [HttpPost]
    Public ActionResult ActionName(string Date)
    {
       // do whatever with Date
       return View();
    }
}

手遅れですが、将来的には誰にでも役立つことを願っています

于 2016-11-03T14:53:34.593 に答える
-3

あるコントローラーから別のコントローラーにデータを渡す必要がある場合は、ルート値でデータを渡す必要があります。どちらも要求が異なるため、あるページから別のページにデータを送信する場合は、ユーザークエリ文字列(ルート値と同じ)を使用する必要があります。

しかし、あなたは1つのトリックを行うことができます:

呼び出し元のアクションで、呼び出されたアクションを単純なメソッドとして呼び出します。

public class ServerController : Controller
{
 [HttpPost]
 public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
 {
      XDocument updatedResultsDocument = myService.UpdateApplicationPools();
      ApplicationPoolController pool=new ApplicationPoolController(); //make an object of ApplicationPoolController class.

      return pool.UpdateConfirmation(updatedResultsDocument); // call the ActionMethod you want as a simple method and pass the model as an argument.
      // Redirect to ApplicationPool controller and pass
      // updatedResultsDocument to be used in UpdateConfirmation action method
 }
}
于 2013-03-13T13:09:15.547 に答える