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"]);