2010-02-01 120 views
16

考慮場景:當我按瀏覽器BACK按鈕時會發生什麼?

  1. 我參觀了使用ASP.NET建立了一個網站的頁面。該頁面是一個簡單的包含ASP.NET服務器控件的aspx頁面。

  2. 我點擊了一個鏈接,該鏈接將我帶到同一網站上的其他頁面。我點擊瀏覽器的按鈕返回按鈕。

問題:在頁面生命週期而言,會發生什麼?是否發生所有事件或者瀏覽器僅顯示頁面的緩存版本而不提出任何請求?

回答

15

我認爲最好的答案是:它取決於瀏覽器,特別是在發佈/發佈後。

舊版瀏覽器用於彈出確認對話框,顯示「該頁面包含將重新提交的POST數據」的效果,您可以繼續(重新提交)或取消。由於在ASP.NET WebForms中發生的所有事情都是FORM元素(ViewState,事件等)的一部分,所以會導致整個生命週期重複。

當然,這不會導致重複提交問題,所以很多網站都必須爲重複問題提出解決方法,而今天大多數瀏覽器都只是從緩存中取出頁面。

...這就是除非你重寫緩存控制標題並強制瀏覽器不要將頁面存儲在緩存中。顯然,在這種情況下,它不能從緩存中檢索,所以通常會被重新提交。但是,這又取決於瀏覽器 - 例如,某些瀏覽器不允許通過SSL重新提交,所以如果這是正在使用的協議,則用戶將看到一條消息,指出該頁面已過期/不能所示。

回想一下,可能更好的答案是:作爲網站設計者,當單擊「後退」按鈕時,您確實無法依賴用戶瀏覽器中的任何特定行爲。如果重複提交可能產生負面影響(例如對信用卡收取兩次),那麼您需要採取適當的措施來防止發生這種情況。無論如何,這是一個很好的做法,因爲用戶完全可以簡單地雙擊「提交」按鈕。

+0

我同意Aaronaught的回答。我不會試圖編寫任何假設「後退」按鈕在所有瀏覽器中都會以某種方式行事的代碼。 – jessegavin 2010-02-01 08:04:58

+0

我認爲你考慮過使用控件後備相同頁面然後按下BACK按鈕的不同場景...... 對嗎? – Manish 2010-02-01 09:35:46

+0

@Manish:重要的不一定是用戶的* present *頁面是否有'POST'數據,但是* previous *頁面(後退按鈕會帶給他們的那個頁面)是否有'POST'數據。這包括兩種情況 - 從回發返回,並在上一頁有回發(或「POST」)時從新頁返回。 – Aaronaught 2010-02-01 12:49:32

0

通常所有的事件應該發生,但如果你有一位超級瀏覽器比它可能發生在顯示緩存頁面 你可以將斷點在你的頁面加載,看看它是否會發生

0

該頁面將從緩存中顯示。

+0

所以,如果我有Response.Cache.SetCacheability(HttpCacheability.NoCache)設置,將打回導致瀏覽器發出GET如果這是用戶的最後一個操作,那麼請求這個挑釁性的頁面,或者甚至可以回傳一個回覆? – AaronLS 2010-02-01 07:58:55

+0

是的,它會回發,如果你有Response.Cache。SetCacheability(NoCache)設置,但對於某些頁面,您將看到相同的內容。使用 嘗試使用Response.Cache.SetCacheability Response.Cache.SetExpires(DateTime.Now-new TimeSpan(1,0,0)); Response.Cache.SetLastModified(DateTime.Now); Response.Cache.SetAllowResponseInBrowserHistory(false); – Ravia 2010-02-01 08:21:34

+0

我想你會得到一個「頁面過期」的通知,而不是頁面,但我認爲它依賴於瀏覽器。 – Codesleuth 2010-02-01 08:22:24

1

我們甚至試圖

Response.ExpiresAbsolute = DateTime.Parse("1/1/1980"); 
Response.AddHeader("cache-control", "no-store, must-revalidate, private"); 
Response.AddHeader("Pragma", "no-cache"); 

解決這類問題

相關問題