ViewData、ViewBag 和 TempData 是什么? – MVC 传递数据到当前和后续请求的选项






4.76/5 (139投票s)
ViewData、ViewBag 和 TempData 是什么?
ASP.NET MVC 提供了三种选项 – ViewData
、ViewBag
和 TempData
,用于将数据从控制器传递到视图以及在下一个请求中传递。ViewData
和 ViewBag
几乎相似,而 TempData
执行额外的职责。让我们讨论或获取这三个对象的关键点
ViewBag
和 ViewData
之间的相似之处
- 有助于在从控制器移动到视图时维护数据。
- 用于将数据从控制器传递到相应的视图。
- 短暂的生命周期意味着在发生重定向时,值会变为
null
。这是因为它们的目标是在控制器和视图之间提供一种通信方式。它是一种服务器调用内的通信机制。
ViewBag
和 ViewData
之间的区别
ViewData
是一个从ViewDataDictionary
类派生的对象字典,并使用string
作为键进行访问。ViewBag
是一个利用 C# 4.0 中的新动态特性实现的动态属性。ViewData
需要对复杂数据类型进行类型转换,并检查null
值以避免错误。ViewBag
不需要对复杂数据类型进行类型转换。
ViewBag
和 ViewData
示例
public ActionResult Index()
{
ViewBag.Name = "Monjurul Habib";
return View();
}
public ActionResult Index()
{
ViewData["Name"] = "Monjurul Habib";
return View();
}
在 View
中
@ViewBag.Name
@ViewData["Name"]
TempData
:
TempData
也是一个从 TempDataDictionary
类派生的字典,存储在短暂的会话中,它是一个 string
键和 object
值。区别在于对象的生命周期。TempData
在 HTTP 请求的时间内保留信息。这意味着仅从一个页面到另一个页面。它也适用于 302/303 重定向,因为它位于同一个 HTTP 请求中。它有助于在从一个控制器移动到另一个控制器或从一个操作移动到另一个操作时维护数据。换句话说,在重定向时,“Tempdata
” 有助于在这些重定向之间维护数据。它内部使用会话变量。Temp 数据仅在当前和后续请求期间使用,这意味着它仅在您确定下一个请求将重定向到下一个视图时才使用。它需要对复杂数据类型进行类型转换,并检查 null
值以避免错误。它通常用于存储仅一次的消息,例如错误消息、验证消息。
public ActionResult Index()
{
var model = new Review()
{
Body = "Start",
Rating=5
};
TempData["ModelName"] = model;
return RedirectToAction("About");
}
public ActionResult About()
{
var model= TempData["ModelName"];
return View(model);
}
最后一个机制是 Session
,它的工作方式类似于 ViewData
,就像一个采用 string
作为键和对象作为值的 Dictionary
。这个存储在客户端 Cookie
中,可以用于更长的时间。它还需要更多的验证,以避免拥有任何机密信息。关于 ViewData
或 ViewBag
,您应该明智地使用它们以提高应用程序性能。因为每个操作都会经历完整的 ASP.NET MVC 请求生命周期。您可以在子操作中使用 ViewData
/ViewBag
,但请小心不要使用它来填充无关的数据,这可能会污染您的控制器。