【问题标题】:Cannot store List objects into viewstate无法将列表对象存储到视图状态中
【发布时间】:2014-06-12 17:01:46
【问题描述】:

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

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

【问题讨论】:

  • ScheduleEntry 类是否标记为Serializable?您是否还向列表中添加了一些项目?
  • @Markus 你是对的。实际上 ScheduleEntry 来自 EF,我必须为所有相关类标记 [Serializable] .....

标签: asp.net webforms viewstate


【解决方案1】:

与存储在 Session Memory 中的值相比,存储在 ViewState 中的类需要标记为Serializable,因为在任何情况下都将 ViewState 序列化到页面(只要 Session Memory 保存在服务器上,对象存储在内存中,无需序列化)。这解释了为什么它在对象存储在 Session 中时有效,而在存储在 ViewState 中时无效。

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

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

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

【讨论】:

  • 所有相关类的[Serializable]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多