45

プロジェクトを編集していて、あるコントローラ メソッドに Session[""] があり、別のコントローラ メソッドに TempData[""] がありました。4つに違いはありますか、それとも同じことを行うのに4つの方法しかありません.

4

3 に答える 3

84
  • ViewData/ViewBag - 現在のリクエストの間のみ有効です。
    コントローラーアクションで設定してビューで使用すると、消えます。
    違いは、1 つ目はディクショナリであるのに対し、2 つ目はこのディクショナリの単なるdynamicラッパーであることです。
    ただし、どちらも同じデータを指しています。
    ViewBag は ASP.NET MVC 3 で導入されました。

例:

public ActionResult Index()
{
    ViewData["foo"] = "bar";
    return View();
}

ビュー内では、次の値を使用できます。

<div>@ViewData["foo"]</div>

ViewBag と同じですが、動的です。

public ActionResult Index()
{
    ViewBag.foo = "bar";
    return View();
}

ビュー内では、次の値を使用できます。

<div>@ViewBag.foo</div>

ご覧のとおり、ViewData/ViewBag は、ビュー モデルを使用する従来の推奨される方法と比較して、コントローラー アクションからビューに情報を渡す代替方法にすぎません。

public class MyViewModel
{
    public string Foo { get; set; }
}

その後:

public ActionResult Index()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

強く型付けされたビュー内:

@model MyViewModel
<div>@Html.DisplayFor(x => x.Foo)</div>

ご覧のとおり、ビュー モデルを使用すると、コントローラー アクションからビューに情報を渡す際に、厳密に型指定されたアプローチが提供されます。

  • TempData - 単一の後続のリクエストの間、情報を永続化できます。TempData 内に何かを格納してからリダイレクトします。リダイレクト先のターゲット コントローラー アクションでは、TempData 内に格納された値を取得できます。

例:

public ActionResult Foo()
{
    TempData["foo"] = "bar";
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var value = TempData["foo"] as string;
    // use the value here. If you need to pass it to the view you could
    // use ViewData/ViewBag (I can't believe I said that but I will leave it for the moment)
    return View();
}

TempDataASP.NET MVC は、保存された値を読み取ると、その値を自動的に期限切れにします。内部では、ASP.NET MVC が情報を .xml ファイルに永続化しSessionます。

  • セッション- 期限切れにならない点を除いて TempData と同じ - 単一のリダイレクトではなく、すべてのリクエストに対して有効です。
于 2012-10-01T16:10:01.713 に答える
5

ビューデータ:

  • から継承された特別な辞書ViewDataDictionaryです。
  • コントローラーからビューにデータを送信するために使用されます。
  • その寿命は現在の要求です。
  • 持っていると破壊されますRedirect
  • セキュリティ上の理由から、使用前に確認することをお勧めしnullます。
  • キャストは操作のために行う必要があります。

ビューバッグ:

  • 動的な型です (この型は c#4 で示されます)。

  • LikeViewDataは、コントローラーからビューにデータを送信するために使用されます。

  • 現在のリクエストにおけるその値の有効期間。
  • ページ間のリダイレクトでは、その値は null になります。
  • セキュリティ上の理由から、使用前に確認してくださいnull
  • キャストする必要がないので、 よりも高速ですViewData

温度データ:

  • から派生した特別な種類の辞書TempDataDictionary
  • 有効期間が短く、ページ間で情報を送信するために使用されます ( Redirect)。
  • を完全にレンダリングした後View、その値は になりますnull
  • セキュリティ上の理由から、使用前に確認してくださいnull
  • キャストは操作のために行う必要があります。

セッション:

  • 異なるリクエスト間で情報を送信するために使用されます。
  • その値はnullnull 値ではありません。一定時間後でなければ(session expire)。
  • セキュリティ上の理由から、使用前に確認してくださいnull
  • キャストは操作のために行う必要があります。

この記事では、ViewData、ViewBag、TempData の違いについて説明します。必要に応じて、この記事を参照していただければ幸いです。

于 2016-11-21T06:46:15.690 に答える