您是否遇過這樣的問題?無緣無故的在數(shù)據(jù)庫出現(xiàn)了兩條一樣的數(shù)據(jù)。如果有遇過的話,你覺得是什么原因導致的呢?在這里我告訴你一個這樣的場景,相信你也有過這樣的經(jīng)驗:用戶點擊一個提交按鈕,此時頁面由于網(wǎng)絡或服務器繁忙原因,導致響應不過來用戶的請求。這時在用戶看到的這樣一翻情景,點擊了沒反映,心急點的用戶可能會狂點,這樣,如果數(shù)據(jù)庫或服務端沒有好鎖的控制時,就會導致插入兩條數(shù)據(jù)。
那么解決方案該怎么做呢?一般的做法是通過驗證碼,但驗證碼要用戶輸入數(shù)據(jù),用戶體驗不好。但根據(jù)這個原理,我們可以做稍微的改造,就能達到目的,下面是我的做法:
首先在頁面加載的時候,生成一個隨機數(shù),并保存在session里面,同時賦值給一個hidden控件。代碼如下:
1 protected override void OnInit(EventArgs e)
2 {
3
4 if (Page.IsPostBack)
5 {
6 if (hc.Session[SessionKey] != null)
7 {
8 isrepost = !hc.Session[SessionKey].Equals(MyConvert.PToInt32(this.ClientID, 0));
9 }
10 }
11 Random rd = new Random();
12 hc.Session[SessionKey] = rd.Next(999999);
13 }
上面的代碼生成隨機數(shù),保存Session,然后在Render事件里面賦值。
1
protected override void Render(HtmlTextWriter output)
2
{
3
this.Value = hc.Session[SessionKey].ToString();
4
base.Render(output);
5
} 這樣控件就完成了。
本控件繼承了HiddenField控件。
這個控件有兩個自定義屬性:SessionKey:控件session的鍵值;IsRepost:布爾型,true為重復提交了,反之正常操作。
控件拖到界面后調(diào)用也很方便。
1 protected void Button1_Click(object sender, EventArgs e)
2 {
3 if (CheckRepost1.IsRepost)
4 {
5 Response.Write("<b>您太心急啦,連續(xù)點擊了兩次按鈕,造成重復提交!^_^</b><br>");
6 }
7 System.Threading.Thread.Sleep(4000);
8 }
下面附上在線的
EasyTools----CheckRepost使用例子 演示 下載例子 下載EasyTools.dll
Tag標簽: 控件,EasyTools