.NET TIPS

[ASP.NET MVC]リダイレクトの前後でデータを共有するには?[3.5、C#、VB]

山田 祥寛
2010/02/18

 Webアプリケーションでは、リダイレクト処理の前後で一時的にデータを維持したいというのは、よくあるケースだ。

 例えば、「連載:ASP.NET MVC入門 第2回 スキャフォールディング機能で軽々DB連携アプリケーション」で作成したBook/Createアクションを例に考えてみよう。Book/Createアクションは、SQL Server上のBookテーブルに対して書籍情報を登録するためのアクションである。この際、前掲の記事の例では、書籍情報の登録に成功すると、そのまま一覧画面(Book/Indexアクション)にリダイレクトしていただけであったが、そのリダイレクト先で「書籍……の登録に成功しました。」のようなメッセージを表示できると、エンド・ユーザーにも処理の成功がはっきりと伝わり、より好ましい。

 下の画面はその実行例である。

[作成]ボタンをクリック
書籍の新規登録時に成功メッセージを表示

 このような処理を実装するために、これまでであればセッションを利用していたかもしれない。しかしこの場合は、不要になったセッションを即座に破棄するという仕組みを自分で実装しなければならない。ささいなことではあるが、たかがメッセージを表示するためだけに、わざわざコードを記述しなければならないというのは、いかにも面倒なことだ。

 このような状況で活用できるのが、TempDataDictionaryクラス(System.Web.Mvc名前空間)だ。TempDataDictionaryクラスは、その名のとおり、一時的なデータ(以下、一時データ)を保存するためのクラスである。「一時的」とはややあいまいな表現である。もっと具体的にいうならば、TempDataDictionaryクラスとは、

現在のリクエストと次のリクエストでのみ保持できるデータ

を管理するクラスである。

 TempDataDictionaryクラスを利用することで、リダイレクト前後でのみ維持したい(使用後は即座に削除したい)データを手軽に受け渡しできるようになる。

 それではさっそく、具体的な例を見てみよう。本稿で紹介するのは、冒頭の画面で示したような成功メッセージを表示させるためのサンプルである。本稿では、書籍情報の登録/一覧表示そのもののコード(Book/Index、Book/Createアクション)については説明を割愛するので、こちらについては前述の記事も併せて参照されたい。

[参考]一時データの正体

一時データというと、何やら特殊なものにも思われるかもしれないが、内部的には単なるセッション情報に過ぎない。要は、自動的に削除されるべくフレームワークが管理している特別なセッションというわけだ。そのため、一時データの機能を利用するには、セッション機能も有効になっている必要があるので、注意してほしい。

1. アクション・メソッドを編集する

 Book/Createアクションに対して、以下のコードを追加する。追記部分は太字で表している。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Book b, FormCollection collection) {
  try {
    // Bookオブジェクトの内容を追加&保存
    _db.AddToBook(b);
    _db.SaveChanges();

    // 一時データ(成功メッセージ)を保存
    TempData["msg"] = String.Format(
      "書籍「{0}」の登録に成功しました。", b.title);

    // Indexアクションにリダイレクト
    return RedirectToAction("Index");

  } catch {
    // 登録失敗時はCreateアクションを再描画
    return View();
  }
}
<AcceptVerbs(HttpVerbs.Post)> _
Function Create(ByVal b As Book, ByVal collection As FormCollection) As ActionResult
  Try
    ' Bookオブジェクトの内容を追加&保存
    _db.AddToBook(b)
    _db.SaveChanges()

    ' 一時データ(成功メッセージ)を保存
    TempData("msg") = String.Format( _
      "書籍「{0}」の登録に成功しました。", b.title)

    ' Indexアクションにリダイレクト
    Return RedirectToAction("Index")

  Catch
      ' 登録失敗時はCreateアクションを再描画
      Return View()
  End Try
End Function
一時データ(成功メッセージ)を登録するためのコード(上:BookController.cs、下:BookController.vb)

 TempDataDictionaryオブジェクトは、Controller.TempDataプロパティ経由でアクセスできる。つまり、TempDataDictionaryオブジェクトに値をセットするには、以下の構文でコードを記述すればよい。

TempData[キー名] = 値
TempData(キー名) = 値
[構文]TempDataプロパティ(値の設定)(上:C#、下:VB)

2. ビュー・スクリプトを編集する

 一時データを表示するために、ビュー・スクリプト(Book/Index.aspxファイル)も編集しておこう。追記部分は太字で表している。

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>書籍一覧</title>
</head>
<body>
  <div style="color:Red">
    <%=Html.Encode(TempData["msg"]) %>
  </div>
  <p>
    <%= Html.ActionLink("新規作成", "Create") %>
  </p>
  ……後略……
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>書籍一覧</title>
</head>
<body>
  <div style="color:Red">
    <%=Html.Encode(TempData("msg")) %>
  </div>
  <p>
    <%= Html.ActionLink("新規作成", "Create") %>
  </p>
  ……後略……
一時データを表示するためのビュー・スクリプト(Book/Index.aspx。上:C#、下:VB)

 一時データを取得するには、TempDataプロパティにアクセスするだけだ。(ビュー変数の場合と同様)出力に当たっては、Html.Encodeメソッドでエンコード処理を施すのを忘れないよう、注意してほしい。

TempData[キー名]
TempData(キー名)
[構文]TempDataプロパティ(値の取得)(上:C#、下:VB)

 以上を理解できたら、実際にサンプルを起動してみよう。データの登録に成功すると、冒頭の画面のように成功メッセージが表示されることを確認してほしい。また、Book/Indexアクションにもう一度アクセスすると、今度はメッセージが表示されなくなっている(一時データ)が破棄されることも確認してほしい。End of Article

利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:ASP.NET MVC
使用ライブラリ:TempDataDictionaryクラス(System.Web.Mvc名前空間)

この記事と関連性の高い別の.NET TIPS
[ASP.NET]SQL Serverモードのセッション管理で情報を永続化するには?
Visual Studio 2005の一時プロジェクトが作成されるフォルダは?
[ASP.NET AJAX]非同期通信で発生した例外の処理方法を変更するには?
[ASP.NET]セッション情報をSQL Server上で管理するには?
一時ファイル(テンポラリ・ファイル)を作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間