[解決済み】ViewBag、ViewData、TempDataについて
質問
をどのような場合に使用するのか、どなたか教えてください。
- TempData
- ビューバッグ
- ビューデータ
コントローラ1に値を設定し、そのコントローラがコントローラ2にリダイレクトされ、コントローラ2がビューをレンダリングするという要件があります。
私はViewBagを使用しようとしましたが、値は私がコントローラ2に到達するまでに失われてしまいます。
使用するタイミングやメリット・デメリットを知ることができますか?
ありがとうございます。
解決方法は?
<ブロッククオート1) TempData
リダイレクトのために生き残るデータを保存できるようにします。内部的にはSessionをバッキングストアとして使用し、リダイレクトが行われた後は自動的にデータが退避されます。パターンは以下の通りです。
public ActionResult Foo()
{
// store something into the tempdata that will be available during a single redirect
TempData["foo"] = "bar";
// you should always redirect if you store something into TempData to
// a controller action that will consume this data
return RedirectToAction("bar");
}
public ActionResult Bar()
{
var foo = TempData["foo"];
...
}
2)ViewBag、ViewData
コントローラのアクションに、対応するビューで使用するデータを格納できるようにします。これは、アクションがビューを返し、リダイレクトを行わないことを想定しています。現在のリクエストの間だけ生きています。
パターンは以下の通りです。
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
とビューに表示されます。
@ViewBag.Foo
またはViewDataを使用します。
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
とビューに表示されます。
@ViewData["Foo"]
ViewBag
は単なる動的なラッパーで
ViewData
で、ASP.NET MVC 3にのみ存在します。
とはいえ、この2つの構成は決して使うべきではないでしょう。ビューモデルと強く型付けされたビューを使用すべきです。つまり、正しいパターンは以下の通りです。
ビューモデル。
public class MyViewModel
{
public string Foo { get; set; }
}
アクション
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
強い型付けされたビュー。
@model MyViewModel
@Model.Foo
簡単な紹介の後、質問にお答えしましょう。
<ブロッククオート私の要件は、コントローラ1に値を設定することです。 コントローラはControllerTwoにリダイレクトされ、Controller2がレンダリングします。 ビューを表示します。
public class OneController: Controller
{
public ActionResult Index()
{
TempData["foo"] = "bar";
return RedirectToAction("index", "two");
}
}
public class TwoController: Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Foo = TempData["foo"] as string
};
return View(model);
}
}
と対応するビュー(
~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
TempDataの使用には欠点もあります。ユーザーがターゲットページでF5キーを押した場合、データが失われるからです。
個人的には、TempDataも使っていません。なぜなら、内部でセッションを使用しており、私のアプリケーションではセッションを無効にしているからです。私は、よりRESTfulな方法でこれを実現することを好みます。リダイレクトを行う最初のコントローラアクションで、データストアにオブジェクトを保存し、リダイレクト時に生成された一意のIDを使用します。そして、ターゲットアクションでは、このIDを使用して、最初に格納されたオブジェクトをフェッチバックします。
public class OneController: Controller
{
public ActionResult Index()
{
var id = Repository.SaveData("foo");
return RedirectToAction("index", "two", new { id = id });
}
}
public class TwoController: Controller
{
public ActionResult Index(string id)
{
var model = new MyViewModel
{
Foo = Repository.GetData(id)
};
return View(model);
}
}
ビューはそのままです。
関連
-
[解決済み] Html.DisplayForの構文は何のためにあるのですか?
-
[解決済み] ファイルまたはアセンブリ 'System.Web.WebPages.Razor, Version=2.0.0.0' を読み込めませんでした。
-
[解決済み] 年、月、日のパラメーターは、表現できない DateTime Exception を記述します。
-
[解決済み] razor viewエンジンでの@文字のエスケープ
-
[解決済み] ViewDataとViewBagの違いは何ですか?
-
[解決済み】ViewBag、ViewData、TempDataについて
-
[解決済み】ASP.NET MVC3 - textareaで@Html.EditorForを使用する。
-
[解決済み】MVC 3 web.configのwebpages:Enabledの機能は何ですか?
-
[解決済み] Razor View-MVC3 ASP.NETでWeb.configからキー値にアクセスする。
-
[解決済み] asp.net MVC3 のカスタムエラーページ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Html.DisplayForの構文は何のためにあるのですか?
-
[解決済み] ファイルまたはアセンブリ 'System.Web.WebPages.Razor, Version=2.0.0.0' を読み込めませんでした。
-
[解決済み】ViewBag、ViewData、TempDataについて
-
[解決済み】ASP.NET MVC3 - textareaで@Html.EditorForを使用する。
-
[解決済み】MVC 3 web.configのwebpages:Enabledの機能は何ですか?
-
[解決済み] Razor View-MVC3 ASP.NETでWeb.configからキー値にアクセスする。
-
[解決済み] Razor HtmlHelper Extensions (またはビューの他の名前空間) が見つかりません。
-
[解決済み] Razor のページに @using 宣言の代わりに余分な名前空間を追加する方法は?
-
[解決済み] asp.net MVC3 のカスタムエラーページ
-
[解決済み] MVC3 Razor。コードブロック内のhtmlを表示する