Tuesday, June 16, 2009

Use validator and client script at the same time

ㄟ~ 故事是這樣的。
寫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:

Comments

0 Responses to "Use validator and client script at the same time"

Post a Comment

Tags