2012-07-04 19 views
2

我正在使用一個包含用戶控件的簡單頁面中的通用列表。Button_click before Page_load

我使用Session變量填充此列表。這個Session變量是在我的Button_click事件中設置的。

當用戶點擊按鈕時會設置會話變量併發生回發。問題是Page_load在Button_clicked事件之前被調用......因爲我們知道這是標準頁面的生命週期。

最後,我的泛型列表沒有更新,因爲會話變量是在page_load之後設置的。

編輯:我的會話變量設置在由代理處理的函數中,該按鈕單擊我的用戶控件。

有沒有解決方案來防止這種情況?有沒有一種解決方案來保持這個列表的價值,在使用會話變量的許多回傳中使用?

感謝你的幫助,

昆汀

回答

1

我找到了解決方案:我必須重寫主頁的Pre_render函數。 事實上,生命週期是:Page_load-> Button_click-> Page_PreRender。

因此,在我的Pre_render函數中,我可以設置我的Session變量並根據需要使用它。

從我所瞭解的情況來看,Pre_Render事件通常用於在控件顯示在頁面上之前初始化控件的值。

謝謝你的幫助。

1

在點擊事件,你應該做的三件事情:

  1. 保存您的通用列表會話。
  2. 保存一個cookie標誌(可以是會話值),表示該列表已保存。
  3. Resonse.Redirect(Request.RawURL)重定向到同一頁面。

而在Page_Load事件,你應該做這樣的事情:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     if (Session["MyFlag"] != null) 
     { 
      //Perform whatever you need to do with your already saved generic list in Session 
      Session["MyFlag"] = null; 
     } 
    } 
} 

如果你需要存儲一個複雜的物體,像在回發一個泛型列表會話是你的朋友。如果你只需要存儲一個值,你可以使用一個cookie或一個ASP.HiddenField,但爲此你最好使用Session。

+1

嗨,你的解決方案似乎是好的。但是,它會觸發其他問題。事實上,用戶輸入的主頁面形式的所有其他變量將被Response.Redirect遺忘。 – Quentin91360

0

爲什麼不把你的會話內部:

if(!IsPostback) 
{ 
    // your session setting here (or method) 
} 

所以它會保持在整個回傳值,而不與每一個回傳設置它。

此外,您可以聲明一個方法,您可以輕鬆地從!IsPostback或您的cick事件調用。

0

你也可以嘗試將你的代碼從Page_Load移動到Page_PreRender,它會在點擊按鈕事件後觸發。這應該可以解決您遇到的問題。

+0

如果創建了諸如LinkBut​​tons之類的控件,則不適用。 –