视图状态和会话使用之间的差异

时间:2013-10-03 13:09:33

标签: c# asp.net session viewstate

我在以下声明中收到错误:

liPages = (List<ListItem>)(ViewState["CurrentSetOfPages"]);

我得到的错误是:

Type 'System.Web.UI.WebControls.ListItem' in Assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.

但是,当我使用以下内容时,每件事似乎都很完美......

liPages = (List<ListItem>)(Session["CurrentSetOfPages"]);

请在此澄清我..

3 个答案:

答案 0 :(得分:2)

因为在ViewState中存储项目的结果是那些存储在页面上的字符串中(为了维护多个请求之间的状态),它们需要是可序列化的,另一方面,Session在内存存储中(如果你正在使用) InProc模式,默认情况下,否则不适用),因此对象不需要可序列化。

另外,请参阅此答案以澄清: Why Viewstate can contain only serializable object?

希望这有帮助。

答案 1 :(得分:1)

Viewstate只能包含可序列化的对象,而Session不需要可序列化的对象。这就是为什么你的代码适用于Session而不适用于viewstate的原因。

此外,you can't store an object in viewstate unless it's marked as serializable.

Viewstate始终作为序列化对象传递回浏览器。因此,只能在其中放置可序列化的对象。如果你没有在其中放置可序列化的对象,它就不能代表它包含的内容。

答案 2 :(得分:0)

ViewState:

ViewState中的序列化和反序列化依赖于ObjectStateFormatter,并且不支持List(通用列表)类型。所以你会收到错误。

要解决此问题,您需要处理自己的序列化。您可以使用 [Serializable] 属性来使其正常工作。 See this post in stackoverflow。在您的情况下,您需要创建继承自ListItem对象的自定义类并应用 [Serializable] 属性。

会话: Please see this post in stackoverflow