Asp.net-Mvc
ViewData、ViewBag、Session、TempData 的正確時間是什麼時候
我正在編輯一個項目,我在一個控制器方法中看到了 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 相同,只是它永不過期 - 它對所有請求都有效,而不是單個重定向。