【问题标题】:Where ViewData and ViewBag reside?ViewData 和 ViewBag 驻留在哪里?
【发布时间】:2023-03-29 18:50:02
【问题描述】:

注意:这不是 this 问题的重复,因为它没有完全回答问题。

我的问题是,当您将值分配给 ViewDataViewBag(如 TempData)驻留在 Session 中时,它究竟存储在哪里。

两者都位于Session 中?

如果不是,那在哪里?

【问题讨论】:

  • 您链接的问题答案明确指出:这完全发生在服务器端,但数据“存储”在服务器上的想法具有误导性。这些是仅在 HTTP 请求的生命周期内存在的瞬态对象。
  • 但我的问题是它驻留在会话中?如果没有在哪里?我也知道这些对象的生命周期和限制。但它所在的地方正是我要寻找的。你能比链接的更详细地回答这个问题吗?
  • 两者都驻留在会话中。您可以通过禁用控制器上的 SessionStateBehavior 来检查这一点。看看这里c-sharpcorner.com/UploadFile/ff2f08/…
  • 我不确定“居住”是什么意思。 ViewBagViewDataControllerBase 类的属性。
  • viewbag 和 viewdata 作为控制器的属性,存储在堆上,因为引用类型在 .net 中。它们不会保留在会话中,而是从控制器传递到 viewpage 。当请求结束时,控制器被释放,内存地址被标记为垃圾回收。

标签: asp.net-mvc viewbag viewdata


【解决方案1】:

正如@SlickSim 在评论中提到的,它们存储在堆中,因为引用类型在.net 中。

ViewBagdynamic 类型,但在内部是 System.Dynamic.ExpandoObject()

声明如下:

dynamic ViewBag = new System.Dynamic.ExpandoObject();

这就是为什么你可以这样做:

ViewBag.Foo = "Bar";

继承层次结构:

System.Object    
    System.Dynamic.ExpandoObject

欲了解更多信息ExpandoObject

请阅读this codeproject 上有关值类型、引用类型、堆和堆栈的文章,这可能有助于您了解 ViewData 和 Viewbag 所在的位置。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2013-07-23
    • 2015-10-24
    • 2010-09-27
    • 2011-12-21
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多