2009-10-26 33 views
0

需要關於頁面生命週期的幫助。頁面週期和查看狀態問題

當我有一個按鈕,它是Click處理程序在ViewState中存儲一個值。
單擊按鈕時發生回發,但是如果嘗試讀取pageload中的viewstate值,我會得到錯誤的值。

刷新頁面時,需要根據viewstate中的值顯示標籤。

Page_Load不適合這個地方。

在什麼頁面事件中我應該顯示這個標籤?

回答

5

所以頁面加載事件流程爲:

  1. 的形式操作會導致回發
  2. Page_Load事件
  3. 按鈕單擊事件
  4. 渲染/ Unload事件

在步驟2您正在從視圖狀態讀取變量並設置標籤。在第3步中,您將在視圖狀態中設置值。

正如您所觀察到的,您使用的事件順序不正確。有兩種方法可以解決這個問題:將標籤設置器代碼放入渲染/卸載事件中。另一個是重構你的代碼,使標籤通過Button Click事件而不是在Page_Load事件中設置;我會推薦它作爲正確的行動。

您可能希望結賬What is the ‘page lifecycle’ of an ASP.NET WebForm?以更好地處理頁面生命週期。


回覆評論:如果有多個標籤設置,您可以查看內聯代碼來設置標籤。該代碼是這樣的:

代碼頁

<asp:Label id="id1" runat="server" text="<%=Label1Text%>" /> 

代碼隱藏

private string m_Label1Text; 
public property string Label1Text { 
    get { return m_Label1Text; } 
    set { m_Label1Text = value; } 
} 

這樣,你通過Label1Text屬性設置你的文字,它被轉移到窗體時它被呈現。如果您需要更多關於內聯代碼的信息,您可以在這裏嘗試這個Tutorial

+0

在click事件中設置此標籤時出現問題,因爲有許多按鈕會將不同的值保存到viewstate中,所以在每個按鈕的click事件中設置標籤效果不佳。 – samuel 2009-10-26 16:53:32

+0

謝謝,這很好。 – samuel 2009-10-26 17:24:47

+0

好的答案,解釋+示例+文檔參考和響應評論。 – samuel 2009-10-26 17:25:53

0

您遇到的問題是,Page_Load中運行之前按鈕單擊處理程序,讓您得到:

  1. 點擊按鈕
  2. 檢查視圖狀態值(它有沒有已設置)
  3. 按鈕處理程序運行並設置Viewstate

您可以嘗試Page_Prerender,這應發生在控制處理程序被觸發後。

0

在您的代碼隱藏中重寫LoadViewState和SaveViewState方法。