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

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

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

本記事は ViewBag、ViewData および TempData の使い方を解説していまが、 ViewModel の採用をおすすめします。よければ下記記事もご参照の上、ご検討ください。

blogs.jp.infragistics.com

 

原文: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 を使用できます。

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

 

Ignite UI for ASP.NET MVC

Ignite UI for ASP.NET MVC は、データグリッドやチャートなど100種類以上のUIコントロールを収録した完全版UIライブラリです。ダイナミックでレスポンシブルなWebアプリケーション開発作業の効率化を支援します。.NET 5に対応。

Ignite UI for ASP.NET MVC はトライアル版での試用が可能です。トライアル版を利用するためには こちらのページ よりアカウントの作成を行ってください。登録より30日間、弊社のテクニカルサポートをご利用いただくことが出来ますのでお気軽にお問い合わせください。

また、製品をご購入をご検討のお客様は こちらのページ よりお気軽にお問い合わせください。