

ASP.NET にて二重送信の対応をしているのですが、バリデーションとJSのクリックイベントがぶつかってしまい、イベントハンドラまでたどり着けません・・・。

**aspx**

[code]

    <asp:ImageButton ID="imgUpdate" runat="server" CausesValidation="false"
     OnClientClick="return　isValid();　
    　"ImageUrl="~/Images/Update32x32.png"　
    　Text="Update" ToolTip="Update"　OnClick="imgUpdate_Click" />
    
[/code]

**JavaScript**

[code]

    <script type="text/javascript">
    function isValid() {
       $('form').submit(function() {      
           Page_ClientValidate();
           if (!Page_IsValid) return false;
    　　　　// 二重送信防止
    　　　　$(this).submit(function () {
        　　　　return false;
           });
       }); 
     }
    </script>
    
[/code]

[参考URL](http://domainwebcenter.com/?p=1602)

一度クライアントでバリデーションエラーが出ている状態でsubmitし、その後エラーを修正して再度submitを押下したところ、二重送信と判断されてしまいます。  
（CausesValidation="false" にすればバリデーションの順番を調整できる、と認識していたのですが、その後の二重送信防止の処理で
return false になっているようです。）

デバッグしたところ、`$(this).submit(function (){ `
に何度もアクセスされてしまうのですが、条件分岐に何か間違いがあるのでしょうか。


CC BY-SA 3.0
2016-05-23T12:17:16.957
25111
2016-05-23T16:39:31.557
2016-05-23T12:28:43.513
9381
9381
question
javascript c# .net asp.net
JavaScript のクリックイベントがASPのバリデーションとぶつかる


なぜ質問文のコードでポストバックが発生しないのかは分かりませんが、2点問題があるのでそこを修正すれば正常動作するものと思います。

まず、

> デバッグしたところ、`$(this).submit(function (){`
> に何度もアクセスされてしまうのですが、条件分岐に何か間違いがあるのでしょうか。

ですが、これは`isValid()`が実行されるたびに`form.onsubmit`に関数をバインドしているからです。なので1クリックで`Page_IsValid`が`true`にならなかった場合は以前のクリックで登録した関数も呼び出されることになります。

それから`CausesValidation`による順序調整ですが、`jQuery`で登録された`onsubmit`イベントは必ず`onclick`属性の`WebForm_OnSubmit()`より後に発生します。なので`onclick`でバインドする必要は特にありません。

以上の理由から`CausesValidation`を特に指定せずに

[code]

    <script type="text/javascript">
        $('form').submit(function () {
            if (Page_IsValid)
                $(this).submit(function () {
                    return false;
                });
        });
    </script>
    
[/code]

のようなスクリプトをロード時に実行しておけば二度押し防止になります。


CC BY-SA 3.0
2016-05-23T16:39:31.557
25121
2016-05-23T16:39:31.557
5750
25111
answer