无法将List对象存储到viewstate中

时间:2014-04-27 03:59:34

标签: asp.net webforms viewstate

我正在尝试存储一些临时列表数据,以便我可以让用户在保存到数据库之前对其进行编辑。

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编码字符串是否可能被列表数据破坏?

1 个答案:

答案 0 :(得分:1)

与存储在会话内存中的值相比,存储在ViewState中的类需要标记为Serializable,因为ViewState在任何情况下都被序列化到页面中(只要会话内存保存在服务器上) ,对象存储在内存中而不进行序列化)。这解释了为什么它在对象存储在Session中时起作用,而在存储在ViewState中时不起作用。

因此,将Serializable属性添加到ScheduleEntry类和所有相关类应该可以解决问题:

[Serializable]
public class ScheduleEntry
{
    // ...
}

有关ASP.NET ViewState的详细信息,请参阅此link