C# 在MVC3中,在视图中存储对象以实现状态持久化的最佳方法是什么?

C# 在MVC3中,在视图中存储对象以实现状态持久化的最佳方法是什么?,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 3,我正在使用ASP.NET MVC 3,我需要在请求之间维护一个C#对象。它维护一些服务器端状态信息,这些信息对这个问题并不重要。当前,该对象被序列化到会话中,然后在每次请求时被拉出 这种方法的问题是对象特定于会话,但我希望它特定于每个请求。因此,在浏览器中打开第二个选项卡基本上会有自己的对象,而不是共享与第一个选项卡相同的对象,因为它是同一个会话 所以很明显,我需要将这个对象存储在页面上,并通过请求将其传回。我想知道最好的办法是什么。客户端不需要此对象中的信息,并且此对象中的数据不是敏感数据,因

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

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


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

您可以使用Html。从Futures项目中序列化。您可以通过安装程序包Mvc3Futures来获得它。我在c#中实现了一个版本的Facebooks BigPipe,并使用HttpContextBase项集合来存储请求之间的每个对象

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

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

  • thingToStore=newkeyvaluepair(“key1”,您的对象)
  • 添加到会话状态
  • 在用户窗体中隐藏密钥
  • 返回后/操作调用时检索键
  • 通过键检索对象
  • 密钥可以是唯一的,因此可以根据您提供的密钥生成器注入对象持久性的类型


    无论如何,这是一种方法

    这似乎是一个真正的固溶体。我会尝试一下,然后回来汇报。谢谢让我知道,亚历克斯。我可能也会用到它。这个效果很好。抱歉,更新时间太长。它使用起来非常简单。强烈推荐。此外,我认为这应该是MVC的一部分,而不是未来项目。它对于制作向导等非常有用。有没有理由不简单地使用
    Html.Hidden
    Html.HiddenFor
    ?因为我需要序列化C对象。如果我用一个隐藏字段,我就必须为对象的每个属性都有一个隐藏字段,而不是将对象集中到一个viewstate样式的存储中,然后在下一个请求时序列化它。哦,我错过了。这更有意义。抱歉:)@Christopherraris不用担心:)这是一个非常聪明的快速修复方法。