ASP.NET MVCのViewData、ViewBag、TempDataとは何ですか?
一部の開発者は、ASP.NET MVCの ViewData、ViewBag、TempData の違いと使用法に苦労する場合があります。このブログ記事では、そのすべてを説明します。
私は、エントリーレベルの開発者が、ASP.NET MVCの ViewData、ViewBag、TempData の違いや使い方に苦労しているのをよく見てきました。そして、このトピックに関する多くの記事やブログ投稿がありますが、私はそれを簡単に説明しようとします。
まず、ViewData、ViewBag、TempData の 3 つはすべて、さまざまなシナリオでデータを伝送または渡すために使用されるASP.NET MVC内のオブジェクトです。次の場合は、データを渡す必要があります。
- コントローラーからビューにデータを渡します。
- 1 つのコントローラーから別のコントローラーにデータを渡します。
- あるアクションから別のアクションにデータを渡します。
- 後続の HTTP 要求間でデータを受け渡す
より高いレベルでは、次の図に示すように、ViewData、ViewBag、および TempData の使用を表現できます。

コントローラーからビューへのデータの受け渡し
コントローラーからビューにデータを渡すシナリオを考えてみましょう。通常、モデルを使用して複雑なデータをビューに渡します。ここでは、次のリストに示すように、データモデルListを使用している強く型付けされたViewがあるとします。
public ActionResult Index()
{
List<Product> p = new List<Product>() {
new Product { Id = 1, Name = "Pen", Price = 300 },
new Product { Id = 2, Name = "Pencil", Price = 100 }
};
return View(p);
}
ビューでは、以下のリストに示すように、モデルをレンダリングすることでデータが表示されます。
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
th>
<th>
@Html.DisplayNameFor(model => model.Price)
th>
<th>th>
tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
td>
<td>
@Html.DisplayFor(modelItem => item.Price)
td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
td>
tr>
}
</table>
これで、コントローラーからビューにデータ(モデル以外)を渡す必要があります。データを渡すには、2 つの方法があります。

Product データモデル以外の単純な文字列をビューに渡すと仮定します。
Passing data using ViewBag
以下のリストに示すように、ViewBag を使用してデータを渡すことができます。
public ActionResult Index()
{
ViewBag.data1 = "I am ViewBag data";
return View(p);
}
ビューでは、ViewBag データは、次のリストに示すように ViewBag のプロパティとして読み取ることができます。
<h2>@ViewBag.data1</h2>
Passing data using ViewData
次のリストに示すように、ViewData を使用してデータを渡すことができます。
public ActionResult Index()
{
ViewData["data1"] = "I am ViewBag data";
return View(p);
}
ビューでは、ViewData データは、次のリストに示すように、ViewData の文字列値のペアとして読み取ることができます。
<h2>@ViewData["data1"]h2>
ViewData と ViewBag の違いについて調べてみましょう。ViewBag は動的型に基づく動的プロパティですが、ViewData はディクショナリ オブジェクトです。ViewBag からはプロパティとして、ViewData からはキーと値のペアとしてデータを読み取ることができます。両方についてのいくつかの箇条書きは次のとおりです。
ViewData
- これは、ViewDataDictionary クラスのタイプのプロパティです。
- データは、キーと値のペアの形式で渡すことができます。
- ビュー上の複合型データを読み取るには、型キャストが必要です。
- この例外を回避するには、null チェックが必要です。
- ViewData の有効期間は現在の要求に制限され、リダイレクト時に Null になります。
- ViewData は ControllerBase クラスのプロパティです
ViewBag
- これは dynamic 型のプロパティです。
- データはオブジェクトのプロパティとして渡されます。
- データを読み取るために型キャストを行う必要はありません。
- null チェックは必要ありません。
- ViewBag の有効期間は現在の要求に制限され、リダイレクト時に Null になります。
- ViewBagはControllerBaseクラスのプロパティです。
ControllerBase クラスでは、次の図に示すように、両方がプロパティとして定義されています。

ViewBag と ViewData は、コントローラーからビューにデータを 1 サイクルで渡すために使用されるオブジェクトとしてまとめることができます。ViewBag と ViewData で割り当てられた値は、次の HTPP 要求または別のビューへの移動で無効になります。
TempData
ViewData と ViewBag の両方の主要な属性の 1 つは、ライフサイクルが 1 つの HTTP 要求に制限されていることです。リダイレクト時に、データが失われます。あるHTTPリクエストから次のHTTPリクエストにデータを渡す別のシナリオがあるかもしれません。たとえば、1 つのコントローラーから別のコントローラーにデータを渡したり、1 つのアクションから別のアクションにデータを渡したりします。TempData は、1 つの要求から次の要求にデータを渡すために使用されます。

インデックスアクションから読み取りアクションに移動し、移動中にインデックスアクションから読み取りアクションにデータを渡すとします。 したがって、Index アクションでは、次のリストに示すように TempData に値を割り当てることができます。
public ActionResult Index()
{
TempData["data1"] = "I am from different action";
return RedirectToAction("Read");
}
TempData はキーと値のペアとして読み取ることができます。Read アクションでは、次のリストに示すように TempData を読み取ることができます。
public string Read()
{
string str;
str = TempData["data1"].ToString();
return str;
}
ViewData と同様に、TempData もディクショナリ オブジェクトであり、データを読み取るには、型キャストと null チェックが必要です。TempData は、後続の HTTP 要求に対してのみデータを保持できることに注意してください。リダイレクトが確実な場合は、TempData を使用してデータを渡します。
TempData に関するいくつかのポイントは次のとおりです。
- TempData は、1 つの HTTP 要求から次の HTTP 要求にデータを渡すために使用されます。
- 言い換えると、TempData は、あるコントローラーから別のコントローラーにデータを渡したり、アクションから別のアクションにデータを渡したりするために使用されます。
- TempData は BaseController クラスのプロパティです。
- TempData は、セッション オブジェクトにデータを格納します
- TempData は ControllerBase クラスのプロパティです
- データを読み取るには、型キャストと null チェックが必要です。
- TempData の型は TempDataDictionary です。
- TempData は、HTTP 302/303 ステータス コードのような HTTP リダイレクトで動作します
概要
ViewData、ViewBag、TempData は、コントローラー、アクション、ビュー間でデータを渡すために使用されます。コントローラーからビューにデータを渡すには、ViewData または ViewBag を使用できます。あるコントローラーから別のコントローラーにデータを渡すには、TempData を使用できます。
ViewBag、ViewData、TempDataの概念が少し明確になったことを願っています。
Web アプリ用の jQuery HTML5 コントロールを試して、その優れた機能をすぐに活用してください。今すぐ無料トライアルをダウンロード!
