Asp.net-Mvc

ViewData、ViewBag、Session、TempData 的正確時間是什麼時候

  • October 1, 2012

我正在編輯一個項目,我在一個控制器方法中看到了 Session[""],在另一個控制器方法中看到了 TempData[""]。4 之間是否有區別,或者只是 4 種方法來做同樣的事情。

  • ViewData/ViewBag - 僅在目前請求期間有效。
    您在控制器操作中設置它並在視圖中使用它,然後它就會消失。
    不同之處在於第一個是字典,而第二個只是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 將資訊保存到Session.

  • 會話- 與 TempData 相同,只是它永不過期 - 它對所有請求都有效,而不是單個重定向。

引用自:https://stackoverflow.com/questions/12676924