在MVC 3中,在视图中存储对象以实现状态持久性的最佳方式

本文关键字:状态 方式 持久性 实现 最佳 对象 MVC 视图 存储 | 更新日期: 2023-09-27 18:24:55

我使用的是ASP.NET MVC 3,我有一个C#对象需要在请求之间维护。它维护一些服务器端状态信息,这些信息对这个问题并不重要。目前,这个对象被序列化到会话中,然后在每次请求时被拉出。

这种方法的问题在于对象是特定于会话的,但我希望它是特定于每个请求的。因此,在浏览器中打开第二个选项卡基本上会有自己的对象,而不是与第一个选项卡共享同一对象,因为它是同一个会话。

所以很明显,我需要将这个对象存储在页面上,并将其与请求一起传递回来。我想知道最好的方法是什么。客户端不需要这个对象中的信息,而且这个对象中数据不是敏感数据,所以我不会试图阻止访问者查看它。我只是想知道在请求之间存储这个对象的最佳方式是什么。有没有一种简单的方法可以将C#对象序列化到视图中,比如在隐藏字段中(类似于web表单的视图状态),然后在每个请求中重新获取它?

在MVC 3中,在视图中存储对象以实现状态持久性的最佳方式

您可以从Futures项目中使用Html.Serialize。您可以通过安装包Mvc3Futures 来获得它

我在c#中实现了一个版本的Facebooks BigPipe,并使用HttpContextBaseItems集合来存储请求之间的每个单独对象。

var someCollection = (List<T>)ViewContext.HttpContext.Items["SomeCollection"];    

因此,另一种解决方案(尽管是一种变通方法)是将对象存储在键值对中,作为会话状态的一部分,并将键存储为隐藏字段。

  1. CCD_ 1
  2. 添加到会话状态
  3. 隐藏用户表单中的密钥
  4. 在回发/操作调用时检索密钥
  5. 通过键检索对象

密钥对于任何都可能是唯一的,因此您可以根据您提供的密钥生成器注入对象持久性的类型。

无论如何,这是一种方法。