2011-06-15 48 views
5

得到一個例外,我得到這樣的:我在使用ViewState的

System.Runtime.Serialization.SerializationException

在大會「的System.Web類型 'System.Web.UI.WebControls.Button' ,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'未標記爲可序列化。 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

異常詳細信息:System.Runtime.Serialization.SerializationException:在程序集'System.Web,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'中鍵入'System.Web.UI.WebControls.Button'標記爲可序列化。

我把它當我嘗試列表保存到一個視圖狀態,並在Page_PreInit事件

我設置的按鈕恢復它,並將其添加到列表中,我後來保存到一個視圖狀態:

 ViewState["Buttons"] = buttons; 

然後我想找回它們,重視他們回到自己的事件處理器:

void Page_PreInit(object sender, EventArgs e) 
    { 

     List<Button> btn = (List<Button>)ViewState["Buttons"]; 
     if (btn!=null) 
     { 
      foreach (var item in btn) 
      { 
       item.Width = 20; 
       item.Command += obtainTopicsPerPage_Click; 
       item.CommandName = tPage.ToString(); 
       item.Text = tPage.ToString(); 
      } 
     } 
    } 
+3

在視圖狀態中存儲按鈕的某些值,而不是對象本身,並在下一頁加載時從狀態重新創建它。或者,Session對象可以很好地存儲對象引用,並且可以減少客戶端的開銷。 – asawyer 2011-06-15 11:52:05

+1

我如何保存按鈕之間的每個回發之間的狀態,因爲它們之間的所有事件都消除了回傳:(...當我在回發後按按鈕沒有eventhanlder方法觸發 – 2011-06-15 12:04:44

回答

5

據抗辯n消息,System.Web.UI.WebControls.Button不可序列化。 (這並不奇怪。)爲了將某些內容保存到ViewState,它必須是可序列化的,以便可以將其完整的「self」寫入字符串並存儲在ViewState頁面上的hidden表單值中。

你爲什麼試圖在ViewState中存儲Button? ViewState對於存儲小值很有用,否則它會隱藏在窗體中。但整個UI控件?你想用這個來完成什麼?

如果您只是需要根據ViewState的一些數據動態創建Button控件,那麼您應該只存儲最小數量的數據以實現這一點,並從該數據的代碼中創建Button。例如:

List<string> btn = (List<string>)ViewState["ButtonStrings"]; 
foreach (var str in btn) 
{ 
    var item = new Button(); 
    item.Width = 20; 
    item.Command += obtainTopicsPerPage_Click; 
    item.CommandName = tPage.ToString(); 
    item.Text = tPage.ToString(); 
    // some use of the str from the ViewState 
    // or if all you need is a count, just store an int in ViewState and use a for loop 
} 
+0

同意由@David提供的答案。 – 2011-06-15 11:53:21

+0

我需要按鈕重新附加他們的處理方法..更深的代碼,我將按鈕以編程方式附加到事件處理程序。但因爲有回發,按鈕不會出現,並沒有他們的事件。因此,我需要在prePage_init事件處理程序中重新附加它們的事件處理程序。 – 2011-06-15 12:01:44

+2

@Dmitry Makovetskiyd:聽起來好像你正在做一件嚴重錯誤的事情。 – leppie 2011-06-15 12:04:32

相關問題