【问题标题】:When to use ViewBag, ViewData, or TempData in Mvc3何时在 Mvc3 中使用 ViewBag、ViewData 或 TempData
【发布时间】:2012-09-08 19:58:33
【问题描述】:

何时在视图中使用 ViewBag、ViewData 或 TempData。 在控制器中,我想将对象发送到视图。我想知道在这种情况下哪个是最好的。 我想要视图页面中的对象。

【问题讨论】:

标签: asp.net-mvc-3


【解决方案1】:

仅当您需要数据可用于下一个请求时才使用 TempData。

TempData["myInfo"] = "my info";

然后在下一个请求中,它会在那里......但在那之后就会消失。

使用 ViewBag 处理大部分额外数据需要传递到您的视图,而不是 @model

ViewBag.MyInfo = "my info";

然后从您的视图中访问它。

使用 ViewData 访问/输入与 ViewBag 完全相同的信息,除了作为集合而不是动态对象的属性。

ViewData["MyInfo"]

访问与 ViewBag.MyInfo 完全相同的数据

请注意,我使用了字符串,但这些可以存储您想要的任何对象。

另外需要注意的是:TempData 和 ViewData 都是存储对象值的字典,因此在使用它们时必须将它们转换为它们的原始类型。然而,ViewBag 使用动态的,并且您并不总是需要强制转换它,因为它是在运行时完成的。一些方法(如扩展方法)虽然不能处理动态,所以你需要在这些情况下进行强制转换。

【讨论】:

  • 谢谢我了解用法
  • 还值得记住的是,TempData 使用 Session,因此在网络场上不可靠,除非网络场使用粘性会话或进程外会话状态。如果下一个请求被退回到另一台机器,您的会话可能不可用。
  • 我可以从这里stackoverflow.com/a/17199709/2015869 补充一点关于TempData 吗?
【解决方案2】:

恕我直言,体面的设计实践 -

ViewBag = 从不。 ViewData = 从不。 这些是基于魔术字符串的字段,也无法在任何编译时实例中被捕获。

您的 ViewWModel 应该包含它需要的一切。 这就是人生的目的。不要回避它的目的。 TempData 仅用于状态消息或您不想缓存但仅可用于下一个请求的对象。

【讨论】:

  • 我真的想不出使用临时数据的充分理由。
  • 它也依赖会话对象的事实是要小心远离它,但有些人真的很喜欢它用于将状态消息传递到下一页而不必担心 url 传递/编码。
猜你喜欢
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多