在 [ASP.NET] 跨瀏覽器禁止使用者返回上一頁 (討論篇) 中
提到了要達到 Server 端檢查,並禁止返回上一頁,必需透過 Ajax,
簡單地說,便是要以 Call Back 的方式,問 Server 要導向的網頁,
再透過 location.replace('新頁面連結'); 使跳到下一頁時,無法返回上頁,
以下提到了兩種解決方式,
1. 自製 Ajax Button - 彈性較大,適合練習者使用,能加強對 Asp 的熟悉度
2. 利用 Update Panel - 使用簡單,適合應用者使用,只需幾行設定
1. 自製 Ajax Button
使用 Ajax 不難,但麻煩的地方在於,Server 端往往是需要使用者所輸入的資料,
因此,必須將目前所有控制項的值在 Call Back 時也傳到 Server 端,
Server 接到後,還要解析這些參數來做判斷,實在很辛苦
所以我們可以善用既有的資源,
http://www.simonerodriguez.com/ajax-form-submit-example/
這篇清楚提到如何將 submit 以 Call Back 方式完成,
懶得看也沒關係,我們只需用到他取得 Form 中所有控制項的方法
http://dl.dropbox.com/u/27661387/GetQueryString.js
接著再利用 JQuery 提供的 Ajax 方法
$.post(
theForm.action,
getquerystring(theForm),
function (result) { eval(result); });
如此便完成了將 Form 內容傳到 Server 端的步驟,
還須處理的問題是,讓 Server 端知道是哪個按鈕所傳的訊息,以做出對應動作,
當然可以直接用 Post 傳參數,但我比較懶,模仿 Asp 的 Post 方法,
直接在 javascript 設定 theForm.__EVENTTARGET.value ,
便可在 Server 端以 Request["
__EVENTTARGET "] 取得
因此,便可知道是哪個控制項所觸發,再做出對應動作,
在此,我是檢查輸入值,若合法則
Response.Write("location.replace('新頁面連結')");
若不合法則
Response.Write("alert('輸入有誤,請重新輸入')");
如此來達到將資料傳回 Server 又禁止返回上一頁之功能,
完整程式碼下載!!
還是嫌麻煩 ~~
很好,懶惰的工程師才能創造最高的工作效率,
下一個方法,便是將以上都包起來了,
準備好了嗎? 眨眼就結束了喔!
2. 利用 Update Panel
step1. 從工具箱拉 ScriptManager、UpdatePanel,並設定 Button 為 Trigger
step2. 在 Button1_Click,輸入
ScriptManager.RegisterStartupScript(
(System.Web.UI.Page)HttpContext.Current.CurrentHandler,
typeof(System.Web.UI.Page), " ",
"location.replace('新頁面連結')", true);
step3. 歡呼!!
其實原理與第一個方法相同,只是解析表單和 Javascript 都由 asp 做掉了
所以實際上要做的就只有幾個步驟,
完整程式碼下載!!
研究了那麼久,終於找到格外簡單的方法解決,
也算在今年的最後一天畫下個完美的句點,
新年快樂囉!!
-----------------------------------------------------------------------------------------------------------------
歡迎與我討論聯繫
您好,今天剛好有這個需求,所以就找了很多資料,也試了您這個網頁內的『格外簡單的方法』,但是這個方法只能夠replace掉「上一個網頁」,『再上一個』網頁就仍然是看的到,意思是:網頁A->B->C->D按按鍵,會跳回A,按上一頁,原來的D會看不到,但是再上一頁,前面的B與C仍然還是看的到,另外結合了http://blog.miniasp.com/post/2009/03/How-to-clear-browser-history-by-using-JavaScript.aspx
回覆刪除的script,也是一樣的結果
browser是ie 9
附帶一提,後來我加上了這句:
刪除Response.Cache.SetCacheability(HttpCacheability.NoCache)
在win7的ie9下竟然成功了,
所有的history都變成A畫面(A是登入畫面),
但是在win 8的ie10上仍然只有弄掉「上一個」畫面而以。
再另外,爬了更多文,加入這些在page_load之後,ie10也成功了,
刪除HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1))
HttpContext.Current.Response.Cache.SetValidUntilExpires(False)
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches)
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)
HttpContext.Current.Response.Cache.SetNoStore()
HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(False)
但是這都是在「按按鍵」之後(那個按鍵是登出)
若是平常時從browser的「上一頁」按鍵,仍然還是會看到前一頁的畫面。
你好阿~~
刪除沒想到塵封已久的文章還有回文,
言歸正傳,
你所說得這些方法是在HTML中設定不要Cache,偏偏只有IE支援這項功能,
參考討論篇 http://enjoywonderfullife.blogspot.tw/2012/01/aspnet.html
有較詳細的說明,
至於你遇到會回到上上頁的原因,
應該是你只有最後一個按鈕是透過 Ajax 處理吧,
若真到達到完全不能上一步必須所有跟 Server 溝通都是透過 Ajax,
換句話說便是從頭到尾都是同一個頁面,換掉內容而已,因此根本沒有上下頁,
這樣的做法我覺得有點痛苦,尤其是針對已經寫好的系統,改起來很頭痛,
因此若是只是要判斷登入,我想了一個方法,也許可行,
在 MasterPage 的 HTML,在 onload 事件發生時,
加上 javascript 的判斷,決定是否要導向其他頁面,
如此,不管使用者瀏覽到哪個頁面,都會去判斷是否登入後再繼續其他動作,
你試試看吧~~
歡迎一起討論,一起進步~~ ^^