2010-01-29 51 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列表)。