Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 视图状态和会话使用之间的差异_C#_Asp.net_Session_Viewstate - Fatal编程技术网

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

C# 视图状态和会话使用之间的差异,c#,asp.net,session,viewstate,C#,Asp.net,Session,Viewstate,我在以下语句中遇到错误: liPages = (List<ListItem>)(ViewState["CurrentSetOfPages"]); 但是,当我使用下面的方法时,每件事似乎都很完美 liPages = (List<ListItem>)(Session["CurrentSetOfPages"]); liPages=(列表)(会话[“当前页面集]); 请就此向我澄清。因为在ViewState中存储项的结果是这些项以字符串形式存储在页面上(为了在多个请求之间保

我在以下语句中遇到错误:

liPages = (List<ListItem>)(ViewState["CurrentSetOfPages"]);
但是,当我使用下面的方法时,每件事似乎都很完美

liPages = (List<ListItem>)(Session["CurrentSetOfPages"]);
liPages=(列表)(会话[“当前页面集]);

请就此向我澄清。

因为在ViewState中存储项的结果是这些项以字符串形式存储在页面上(为了在多个请求之间保持状态),它们需要可序列化,另一方面会话在内存中存储(如果您使用InProc模式,这是默认模式,否则不适用),因此对象不需要是可序列化的

另外,请参见此答案以了解澄清:


希望这有帮助。

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

另外,
除非对象被标记为可序列化,否则不能将其存储在viewstate中。


Viewstate始终作为序列化对象传递回浏览器。因此,只能在其中放置可序列化的对象。如果未将可序列化对象放入其中,则它无法表示它包含的内容。

ViewState:

ViewState中的序列化和反序列化依赖于,并且它不支持列表(泛型列表)类型。所以你会得到错误

要解决这个问题,您需要处理自己的序列化。您可以使用[Serializable]attibute使其工作。在您的情况下,您需要创建从ListItem对象继承的自定义类,并应用[Serializable]属性


会话:

请参见[[1]:对于会话存储,对象不需要序列化的唯一时间是使用
SessionStateMode.InProc
时。所有其他模式都要求对象实现I serializable。
liPages = (List<ListItem>)(Session["CurrentSetOfPages"]);