什麼是 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。