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