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