最近有一些朋友向我諮詢有關頁面重新整理與按鈕的事情,簡單的說就是當按鈕事件發生後,使用者又按“F5”或重新整理按鈕重新整理了頁面,這樣按鈕中的事件就會重複執行,這不是我們希望看到的。
以前也有一些解決方案,其中有些是Javascript完成的,有些是後台程式碼完成的。前者不是今天討論重點,今天主要向大家介紹一種C#完成的“重新整理”監控方法,當使用者使用“F5”或瀏覽器的[重新整理] 按鈕時,代碼就會檢測到,並以bool值方式返回。這是從以前一個老大的類庫中分離出來的,老大的名字忘了。。。,去掉了無關的內容,只保留檢測重新整理的模組,這樣乾淨些。
“重新整理”是怎麼回事?
重新整理是通過瀏覽器重複向伺服器提交最新請求來完成的,當使用者點擊某個按鈕後,瀏覽器會將按鈕狀態量緩衝,這時如果使用者再使用“重新整理”功能,瀏覽器就會機械的提交包含按鈕狀態量的“最新請求”,而瀏覽器不會為“重新整理”事件提供任何通知(事實上,瀏覽器只對“轉到”事件提供了通知),所以伺服器端無法區分重新整理與一般提交事件,這樣伺服器在收到請求後,自然會重複執行按鈕事件了。
識別“重新整理”原理:
使用一個上下文唯一的票據號,該票據號隨頁面提交或回傳而遞增,每當使用者與伺服器端互動時,代碼會提取上次的票據號碼並與當前票據號碼比較,如果當前票據大於上次的票據,則是提交或回傳,否則則識別為重新整理。
這種方式會用到HttpMoudel,並在其中操作Session。
使用方法:
- 引入dll
http://files.cnblogs.com/isline/MsdnExt.rar
2.修改web.config,在<httpModules> </httpModules>添加以下item:
<add name="MsdnModule" type="Msdn.RefreshModule, MsdnExt"/>
其中“MsdnModule”是一個名字, “Msdn.RefreshModule”是“Msdn”下的“RefreshModule”類型,“MsdnExt”是程式集的名字
3.引入命名空間 using Msdn; 並修改頁面類繼承Msdn.Page
4.使用代碼
代碼
protected void Button1_Click(object sender, EventArgs e)
{
if (!IsPageRefresh)
Response.Write("按鈕事件");
else
Response.Write("頁面重新整理");
TrackRefreshState();
}
原始碼下載:
http://files.cnblogs.com/isline/Refresh.rar
注意:
該方法最好在按鈕事件對應的方法中使用,否則可能會失效。
我是李鳴(Aicken) 歡迎您關注我的下一篇文章。