サーチ…


前書き

ViewDataViewBagは、コントローラからビューにデータを転送するために使用されます。

ViewDataはオブジェクトの辞書にすぎず、文字列でキーとしてアクセスできます。

ViewBagはViewDataと非常によく似ています。 ViewBagは動的プロパティです。 ViewBagは、ViewDataのラッパーです。

TempDataは、HTTPリクエスト時のデータを保持します。つまり、2つの連続したリクエストの間にデータを保持します。 TempDataは、コントローラ間またはアクション間でデータを転送するのに役立ちます。内部的にセッションを使用します。

構文

  1. ViewData [キー] =値;

  2. ViewBag.Key = value;

  3. TempData [key] = value;

ViewData、ViewBag、TempDataとは何ですか?

ViewDataは、ViewModelを使用せずに、コントローラが提示するビューにデータを提供するためのメカニズムです。具体的には、ViewDataはMVCのアクションメソッドとビューの両方で使用できる辞書です。 ViewDataを使用して、アクションメソッドの一部のデータを、アクションメソッドによって返されたビューに転送することができます。

それは辞書なので、辞書のような構文を使ってデータを設定して取得することができます。

ViewData[key] = value; // In the action method in the controller

たとえば、IndexアクションメソッドからIndexビューIndex.cshtmlに文字列メッセージを渡す場合は、これを行うことができます。

public ActionResult Index()
{
   ViewData["Message"] = "Welcome to ASP.NET MVC";
   return View(); // notice the absence of a view model
}

Index.cshtmlビューでこれにアクセスするには、アクションメソッドで使用されているキーを使用してViewDataディクショナリにアクセスします。

<h2>@ViewData["Message"]</h2>

ViewBagは、型指定されていないViewData辞書の動的な同等物です。構文的な砂糖の経験にはC#のdynamic型を利用しています。

いくつかのデータをViewBagに設定するための構文は、

ViewBag.Key = Value;

したがって、前の例でViewBagを使用してメッセージ文字列を渡したい場合は、

public ActionResult Index()
{
   ViewBag.Message = "Welcome to ASP.NET MVC";
   return View(); // not the absence of a view model
}

あなたのインデックスビューでは、

<h2>@ViewBag.Message</h2>

データはViewBagとViewDataで共有されません。 ViewDataは複雑なデータ型からデータを取得するための型キャストが必要で、View Bagが型キャストを必要としない場合にはエラーを回避するためにnull値をチェックする必要があります。

TempDataは、1つのHTTP要求と次のHTTP要求の間でデータを永続化する場合に使用できます。 TempDataDictionaryに格納されたデータの存続期間は、2回目の要求後に終了します。したがって、TempDataは、PRGパターンに従っているシナリオで役に立ちます。

[HttpPost]
public ActionResult Create(string name)
{
   // Create a user
   // Let's redirect (P-R-G Pattern)
   TempData["Message"] = "User created successfully";
   return RedirectToAction("Index");
}
public ActionResult Index()
{
  var messageFromPreviousCall = TempData["Message"] as String;
  // do something with this message
  // to do : Return something
}

return RedirectToAction("SomeActionMethod")と、サーバーは302の応答をクライアント(ブラウザ)に送信し、ロケーションヘッダーの値を "SomeActionMethod"のURLに設定し、ブラウザは完全に新しい要求を行います。この場合、ViewBag / ViewDataはこれらの2つの呼び出しの間でデータを共有するためには機能しません。このようなシナリオでは、TempDataを使用する必要があります。

TempDataのライフサイクル

TempDataに保存されたデータはセッションに保存され、データにアクセスする最初の要求の最後に自動的に削除されます。読んでいない場合は、最終的に読み込まれるまで、またはセッションがタイムアウトするまで保持されます。

典型的な使い方は次のようになります(各行は異なる要求から呼び出されます)。

//first request, save value to TempData
TempData["value"] = "someValueForNextRequest";

//second request, read value, which is marked for deletion
object value = TempData["value"];

//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null

この動作は、 PeekメソッドとKeepメソッドを使用してさらに制御することができます。

  • Peekを使用すると、TempDataに格納されているデータを削除マークを付けることなく取り出すことができるため、将来のリクエストでもデータを利用できるようになります

    //first request, save value to TempData
    TempData["value"] = "someValueForNextRequest";
    
    //second request, PEEK value so it is not deleted at the end of the request
    object value = TempData.Peek("value");
    
    //third request, read value and mark it for deletion
    object value = TempData["value"];
    
  • Keepを使用すると、削除対象のキーが実際に保持されるように指定できます。この場合、データを取得し、それを削除から保存するには、2つのメソッド呼び出しが必要です。

    //first request, save value to TempData
    TempData["value"] = "someValueForNextRequest";
    
    //second request, get value marking it from deletion
    object value = TempData["value"];
    //later on decide to keep it
    TempData.Keep("value");
    
    //third request, read value and mark it for deletion
    object value = TempData["value"];
    

これを念頭に置いて、別のリクエストの値を保持しておきたい場合はPeekを使用し、値を保持する場合はKeepを使用し、追加のロジックに依存します。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow