2010-01-29 60 views
1

我已经加入一个datalist到视图状态为:添加数据列表到视图状态

ViewState["datalist"] = dtlstForm; 

和检索它为:

DataList lis = (DataList)ViewState["datalist"]; 

然后如下因素错误出现:

类型“系统.Web.UI.WebControls.DataList'in Assembly'System.Web, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'is 未标记为可序列化。

+1

要问的问题是“为什么”你想把这个控件放到ViewState中?你通过这样做想达到什么目的? – 2010-01-29 09:25:30

+0

我可以问为什么要将DataList放入ViewState中? DataList是一个控件,在ASP .NET中有一个完美的控件层次结构。 – 2010-01-29 09:26:44

回答

1

除非它实现ISerializable,否则不能在视图状态中放置对象。 viewstate在发送到客户端之前被序列化。

你可以使用Session类似的方式来查看状态,并为所有的意图和目的,它会没事的。我认为会议更需要资源。

datalist是你自己的类吗?如果可以的话,你也可以实现ISerializable,但如果我可以只输入会话,我就不会沿着这条路线走下去。

+0

DataList = System.Web.UI.WebControls.DataList,所以不是OP自己的类。 – 2010-01-29 09:24:32

+0

只有将SessionState设置为InProc(正在处理)并保存在应用程序内存中时,SessionState才会起作用。如果您使用状态服务器或Sql服务器来保存会话状态,则会话中保存的任何对象也需要可序列化。 – 2010-01-29 10:31:20

3

DataList类是不可序列化的(SerializableAttibute没有被设置,它没有实现ISerializable接口)。

这意味着.NET框架无法序列化并将其放入ViewState中。

由于这是一个内置的类,因此无法将其修改为可序列化。

由于DataList需要保存相当多的信息,因此将其放入ViewState会导致ViewState变得非常庞大,这会影响性能,所以不要使其可序列化。也许你可以重新思考你需要放入ViewState中的信息,并且只在其中添加少量信息(例如ID列表)。