我正在尝试存储一些临时列表数据,以便我可以让用户在保存到数据库之前对其进行编辑。
public List<ScheduleEntry> NewScheduleEntry
{
get
{
String PersistentName = "List_ScheduleEntry";
if (ViewState[PersistentName] == null || !(ViewState[PersistentName] is List<ScheduleEntry>))
{
ViewState[PersistentName] = new List<ScheduleEntry>();
}
return ViewState[PersistentName] as List<ScheduleEntry>;
}
}
public List<ScheduleEntry> ListView_CourseScheduleEntry_GetData()
{
return NewScheduleEntry;
}
这不是我第一次使用这种技术,但它不起作用。 没有例外,我可以看到ListView_CourseScheduleEntry_GetData在return语句之前运行。
但如果我将 ViewState更改为Session(没有其他更改),它可以正常工作。不幸的是我不应该在这里使用session,因为它是一个页面事务。
视图状态的Base64编码字符串是否可能被列表数据破坏?
答案 0 :(得分:1)
与存储在会话内存中的值相比,存储在ViewState中的类需要标记为Serializable
,因为ViewState在任何情况下都被序列化到页面中(只要会话内存保存在服务器上) ,对象存储在内存中而不进行序列化)。这解释了为什么它在对象存储在Session中时起作用,而在存储在ViewState中时不起作用。
因此,将Serializable
属性添加到ScheduleEntry类和所有相关类应该可以解决问题:
[Serializable]
public class ScheduleEntry
{
// ...
}
有关ASP.NET ViewState的详细信息,请参阅此link。