asp.net-mvc
ViewData、ViewBag、TempData
サーチ…
前書き
ViewData
とViewBag
は、コントローラからビューにデータを転送するために使用されます。
ViewDataはオブジェクトの辞書にすぎず、文字列でキーとしてアクセスできます。
ViewBagはViewDataと非常によく似ています。 ViewBagは動的プロパティです。 ViewBagは、ViewDataのラッパーです。
TempDataは、HTTPリクエスト時のデータを保持します。つまり、2つの連続したリクエストの間にデータを保持します。 TempDataは、コントローラ間またはアクション間でデータを転送するのに役立ちます。内部的にセッションを使用します。
構文
ViewData [キー] =値;
ViewBag.Key = value;
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
を使用し、追加のロジックに依存します。