什麼是 ViewData ViewBag 和 TempData
ViewData 是控制器在不使用 ViewModel 的情況下向其呈現的檢視提供資料的機制。具體來說,ViewData 是一個在 MVC 操作方法和檢視中都可用的字典。你可以使用 ViewData 將某些資料從操作方法傳輸到操作方法返回的檢視。
由於它是字典,你可以使用類似字典的字典來設定和從中獲取資料。
ViewData[key] = value; // In the action method in the controller
例如,如果要將索引操作方法中的字串訊息傳遞到索引檢視 Index.cshtml
,則可以執行此操作。
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC";
return View(); // notice the absence of a view model
}
要在 Index.cshtml
檢視中訪問它,只需使用 action 方法中使用的鍵訪問 ViewData 字典即可。
<h2>@ViewData["Message"]</h2>
ViewBag 是無型別 ViewData 字典的動態等價物。它利用了 C#dynamic
型別的語法糖體驗。
將一些資料設定為 ViewBag 的語法是
ViewBag.Key = Value;
因此,如果我們想要使用 ViewBag 在前面的示例中傳遞訊息字串,那麼它將是
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC";
return View(); // not the absence of a view model
}
並在你的索引檢視中,
<h2>@ViewBag.Message</h2>
ViewBag 和 ViewData 之間不共享資料。ViewData 需要進行型別轉換以從複雜資料型別中獲取資料,並檢查空值以避免錯誤,因為 View Bag 不需要進行型別轉換。
**** 當你希望僅在一個 http 請求和下一個 HTTP 請求之間保留資料時,可以使用 TempData 。儲存在 TempDataDictionary 中的資料的生命週期在第二個請求之後結束。因此,TempData 在你遵循 PRG 模式的場景中非常有用。
[HttpPost]
public ActionResult Create(string name)
{
// Create a user
// Let's redirect (P-R-G Pattern)
TempData["Message"] = "User created successfully";
return RedirectToAction("Index");
}
public ActionResult Index()
{
var messageFromPreviousCall = TempData["Message"] as String;
// do something with this message
// to do : Return something
}
當我們做 return RedirectToAction("SomeActionMethod")
時,伺服器將向客戶端(瀏覽器)傳送 302 響應,其中位置標頭值設定為 SomeActionMethod
的 URL,瀏覽器將對此發出全新的請求。在這種情況下,ViewBag / ViewData 不能在這兩個呼叫之間共享一些資料。在這種情況下,你需要使用 TempData。