2013-09-30 70 views
1

我想在Page_Unload事件上保存一個值,將它存儲在Session(或ViewState)中,然後從javascript中使用它。但是,只有在回發/刷新頁面後,會話的值纔會更新,但我需要避免頁面刷新,我該如何實現?在沒有刷新的情況下獲取在Page_Unload上更新的會話值?

例子:

中的.cs

public void Page_Unload(object sender, System.EventArgs e) 
{ 
    string s="some text"; 
    if (s.Contains("foo")) Session["bar"] = 37; else Session["bar"] = 38; 
} 

在.aspx

<script type="text/javascript"> 
    function tst() { 
    alert('<%=Session["bar"]%>'); 
    } 
</script> 
+0

你說的是你想避免頁面刷新,但是,你正在做一個頁面卸載事件(這意味着你刷新頁面)。它是否真的處於卸載事件中,您必須執行此代碼,或者可以在控件的Click事件中完成嗎? – CharlesAD

+0

我不能在控件的點擊事件中做到這一點,因爲我需要避免回傳(因爲網頁形式的特定原因) – BornToCode

回答

1

Page_Unload事件在頁面發送到客戶端瀏覽器後觸發(請參閱此link)。因此,您無法將任何值存儲到Session中。

對於您的情況,您可能需要執行回調以避免整頁刷新(請參閱此link)。然後在回調觸發的事件中。在完成所有需要完成的工作之後,您可以執行檢查,然後將必要的變量存儲到會話中用於客戶端JavaScript。

2

激發Page_Unload事件是來不及分配一個新值會話狀態。

相反,您要使用Page_PreRender事件。

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    string s="some text"; 
    if (s.Contains("foo")) Session["bar"] = 37; else Session["bar"] = 38; 
} 

enter image description here

+0

但是這會延遲客戶端獲取頁面直到Page_PreRender完成 - 我想避免這種情況下,該方法中有一個耗時的操作 – BornToCode

+1

@BornToCode我不能推薦替代解決方案,因爲我不知道你的代碼的其餘部分。我的猜測是使用Ajax和進度條(或加載圖標),以便用戶知道該頁面正在工作。 – Win

1

首先,這裏是瞭解事件生命週期的一個有用的頁面。 http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx#general_page_lifecycle_stages

當您的頁面呈現時,<%= Session [「bar」]%>被替換爲當前值。由於您的頁面尚未「卸載」,因此此值尚未更新。換句話說,當JavaScript代碼運行時,不會讀取此值,而是在頁面呈現時。要完成您嘗試的操作,您需要在Pre_Render中設置您的值,而不是Unload事件。

如果Pre_Render不適合您,我可以想象一個解決方案,您可以使用Asyncronous Method調用和AJAX的組合將值存入您的代碼中。以下是關於如何工作的參考:http://msdn.microsoft.com/en-us/library/bb398998.aspx。特別看看你正在描述的最後一部分(即從客戶端腳本獲取會話值)。

  1. 添加腳本管理器到頁面。
  2. 將PageMethods屬性爲true
  3. 添加一個標誌,會話「仍然在它的工作」和「做」
  4. 打電話給你的長期運行過程中使用的Pre_Render的asyncronous委託獲得的價值。
  5. 在異步回調中設置會話值並將新標誌設置爲「已完成」
  6. 在頁面卸載中調用異步委託「EndXXX」方法。
  7. 創建一個檢查標誌值的公共靜態方法,如果設置爲'completed',則返回所需的Session值。
+0

Pre_Render對我不好,因爲我正在運行耗時的操作,並且我不想延遲客戶端獲取頁面直到完成 – BornToCode

+0

我修改了我的答案以添加第二個解決方案。 –

相關問題