インフラジスティックス・ジャパン株式会社のBlog

インフラジスティックス・ジャパン株式会社のチームメンバーが技術トレンド、製品Tips、サポート情報からライセンス、日々の業務から感じることなど、さまざまなトピックについてお伝えするBlogです。

ASP.NET MVC の ViewData、ViewBag および TempData

原文:Dhananjay Kumar » What are ViewData, ViewBag, and TempData in ASP.NET MVC?

ASP.NET MVC の ViewData、ViewBag および TempData の使い分けはエントリ レベルの開発者には難しい場合がよくあると思います。インターネット上には、このトピックに関する数多くの記事やブログ投稿がありますが、ここではわかりやすく説明してみようと思います。

ViewData、ViewBag および TempData の 3 つのオブジェクトは、状況によってデータを保持または渡すための ASP.NET MVC のオブジェクトです。以下場合にデータを渡すための要件があります:

  • コントローラーから View へデータを渡す
  • コントローラーからコントローラーへデータを渡す
  • アクションからアクションへデータを渡す
  • 後続の HTTP 要求間でデータを渡す

以下は、ViewData、ViewBag および TempData の使用に関する概要です。

image

コントローラーから View へデータを渡す

データをコントローラーからビューへ渡すとします。通常、モデルを使用してビューに複合データを渡します。以下は 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);
}

以下に示すように View でモデルを描画することでデータが表示されます。

<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>

ここでコントローラーから View へ (モデル以外に) データを渡す必要があります。データを渡す方法は 2 通りあります。

image

Product データ モデル以外のシンプルな文字列を View へ渡します。 

ViewBag を使用してデータを渡す

以下のコードのように ViewBag を使用しデータを渡します。

public ActionResult Index()
{
    ViewBag.data1 = "I am ViewBag data";
    return View(p);
}

以下のコードのように View で ViewBag のデータは ViewBag のプロパティとして読み込めます。

<h2>@ViewBag.data1</h2>

ViewData を使用してデータを渡す

以下のコードのように ViewData を使用してデータを渡すことができます:

public ActionResult Index()
{
    ViewData["data1"] = "I am ViewBag data";
    return View(p);
}

以下のコードのように view で ViewData は文字列の値のペアとして読み込めます。

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

ViewData と ViewBag の違いを見てみましょう。ViewBag は動的なタイプに基づく動的なプロパティですが、ViewData はディクショナリ オブジェクトです。ViewBag のデータはプロパティとして読み込まれ、ViewData のデータはキー/値ペアとして読み込めます。ViewData と ViewBag の特徴:

ViewData

  • ViewDataDictionary クラス タイプのプロパティ
  • データはキー/値ペアとして渡されることができます。
  • View の複合データを読み込むには型キャストが必要です。
  • 例外を避けるため、ヌルチェックが必要です。
  • ViewData のライフは現在の要求に限られ、リダイレクトされる場合 Null になります。
  • ViewData は ControllerBase クラスのプロパティです。

ViewBag

  • 動的な型のプロパティです。
  • データはオブジェクトのプロパティとして渡されます。
  • データを読み込むための型キャストは必要ありません。
  • ヌルチェックの必要はありません。
  • ViewBag のライフは現在の要求に制限され、リダイレクトされる場合 Null になります。
  • ViewBag は ControllerBase クラスのプロパティです。

以下の画像のように ControllerBase クラスで両者ともプロパティとして定義されています。

image

つまり ViewBag および ViewData は 1 サイクルでコントローラーからビューへデータを渡すために使用されるオブジェクトです。ViewBag および ViewData で割り当てられた値は、次の HTTP 要求また他のビューへ移動することで null になります。

TempData

ViewData および ViewBag の主要な特徴の 1 つとして、両者のライフサイクルが 1 HTTP 要求に制限されるという点があります。両者ともリダイレクトでデータを失います。HTTP 要求から他の HTTP 要求へデータを渡す場合があります。例えば、コントローラーから他のコントローラーやアクションから他のアクションへデータを渡す場合などです。TempData は要求から他の要求へデータを渡すために使用されます。

image

Read 操作から Index アクションへ移動しながら Index 操作から Read 操作へデータを渡すと仮定しましょう。以下のように 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 はディクショナリオブジェクトで、データを読み込むには型キャストやヌルチェックの必要があります。TempData は次の HTTP 要求までデータを保持できることに留意してください。リダイレクトが必要な場合、データを渡すには TempData を使用します。

TempData の特徴に関する概要:

  • TempData HTTP 要求 から 他の HTTP 要求へデータを渡すことに使用されます。

つまり、 TempData はコントローラーから他のコントローラーへまたアクションから他のアクションへ データを渡すために使用されます。

  • TempData は BaseController クラスのプロパティです。
  • TempData はセッション オブジェクトにデータを格納します。
  • TempData は ControllerBase クラスのプロパティです。
  • データを読み込むには Typecasting および ヌルチェックが必須です。
  • TempData の型 は TempDataDictionary です。
  • TempData は HTTP 302/303 状態コード のような HTTP リダイレクトと共に使用します。

概要

ViewData、 ViewBag、および TempData は、コントローラー、アクション、ビュー間でデータを渡すことができます。コントローラーからビューへデータを渡すために ViewData または ViewBag を使用できます。コントローラーからコントローラーへデータを渡すために TempData を使用できます。

最後までお読みいただき、ありがとうございました!