ViewData和ViewBag存放在哪里?

3
注意:这不是与此问题重复,因为它并没有完全回答问题。

我的问题是,当您将值分配给ViewDataViewBag时,它究竟存储在哪里,就像TempData存储在会话中一样。

两者都存储在Session中吗?

如果不是,那么它们存储在哪里?


3
链接中的答案清楚地说明:这完全在服务器端发生,但将数据“存储”在服务器上的想法是具有误导性的。这些是短暂的对象,仅在HTTP请求的生命周期内存在。 - Jojo
但我的问题是它是否驻留在会话中?如果不是那里呢?我知道这些对象的生命周期和局限性。但它驻留在哪里,这就是我正在寻找的。你能比链接中提供更详细的回答吗? - Priyank Sheth
@AbbasGaliyakot:你提供的文章与ViewBag无关。它只是表明在禁用会话后,Session["test"]和TempData["test"]会抛出异常。 - Jojo
@Jojo:我所说的“驻留”是指是否为其创建了任何变量内存?或者它在会话中也被存储/保留了下来? - Priyank Sheth
3
ViewBag和ViewData是控制器的属性,作为.NET中的引用类型存储在堆上。它们不会保存在会话中,而是从控制器传递到视图页面。当请求结束时,控制器被释放并且内存地址被标记为垃圾收集。 - Slicksim
显示剩余2条评论
1个回答

4
正如@SlickSim在评论中提到的,它们存储在堆上,因为引用类型在.net中是这样的。 ViewBag 的类型是 dynamic ,但实际上是一个内部的 System.Dynamic.ExpandoObject() 它的声明如下:
dynamic ViewBag = new System.Dynamic.ExpandoObject();

这就是为什么你可以做到:
ViewBag.Foo = "Bar";

继承层次结构:

System.Object    
    System.Dynamic.ExpandoObject

如果您想了解更多关于ExpandoObject的信息,请查看该链接。

请阅读CodeProject上关于值类型、引用类型、堆和栈的文章,这将有助于您理解ViewData和ViewBag的存储位置。

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接