寫web最怕的就是連線不穩定,好死不死我寫的某塊功能就是專給海外的人處理資料用的。最近使用者跟我反應存檔後跑出兩筆一模一樣的資料.... 根據我推論,應該是因為網路剛好不穩,使用者按了submit以為沒反應又按了一次... 網路不穩歸不穩,兩次request還是都處理了。
就是這樣,所以要想辦法防止這次的request完成前再送一次。
聽起來超簡單,就按一下submit的時候把按鈕disable,複雜一點的,按一下之後先跟使用者做個確認,確定了再disable。
嗯,沒錯。就這樣,reference都不完全符合我要處理的狀況,不過頗有參考價值。
還是自己搞定了Q口Q
首先,原本寫在LinkButton上的onClientClick就不能直接寫了,因為需要多一層判斷,所以要在程式裡動態幫他把attribute加上去。
1: <!--原本在html裡的client confirm不能用-->
2: <asp:LinkButton runat="server" ID="lbSave" CommandName="save" Text="Save"
3: CommandArgument='<%#DataBinder.Eval(Container,"RowIndex")%>'
4: OnClientClick="return confirm('Are you sure?');">
5: </asp:LinkButton>
6:
7: <!--拿掉後: -->
8: <asp:LinkButton runat="server" ID="lbSave" CommandName="save" Text="Save"
9: CommandArgument='<%#DataBinder.Eval(Container,"RowIndex")%>'>
10: </asp:LinkButton>
我在Gridview資料繫結時才去幫他加上onclick的屬性:
1: //加上onclick attritube, 叫用lockBtn的script
2: ((LinkButton)GridView2.Rows[i].FindControl("lbSave"))
3: .Attributes.Add("onclick", "return lockBtn(this);");
script在這:
1: <script language="javascript" type="text/javascript">
2: //lockBtn: 接受觸發者當參數
3: function lockBtn(btn){
4: //先判斷是否已disable,因為linkBtn就算disable了(會變灰色)
5: //但是click一樣會觸發script
6: if(btn.disabled==true){
7: return false;
8: }
9: else{
10: //取得使用者確認
11: var sure = confirm('Are you sure');
12: if(sure==true){
13: //直接disable掉
14: btn.disabled=true;
15: return true;
16: }
17: else{
18: return false;
19: }
20: }
21: }
22: </script>
就這樣。好像沒看到什麼時候解開XD? 因為我原本就有在code裡根據其他數據處理判斷是否enable。所以不必另外處理,每次page_load都會重新設定。搞定。
測試的話,以上面例子來說,動作是在save command裡,可以加個
1: System.Threading.Thread.Sleep(5000);
來觀察disable狀態,也可以趁機多按幾次按鈕看是否真的無作用。
Ref:
Post a Comment