Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  206  : 記事  0  : コメント  838  : トラックバック  43

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板
フィードメーター - Mr.Tの場所

書庫

日記カテゴリ

Mr.Tです、こんにちは。

あれれ、とちょっと悩んだので、Memoです。まあ、今更な話なとこもあるんでしょうが、ご勘弁。

ボタンの二重押しを禁止すべく、クライアントサイド側でボタンを使用不可にしたとき、PostBackが発生しないというものだ。

再現コード:

(default.aspx )

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Test1</title>
<script language="javascript">
    function ShowThis(own)
    {
        own.disabled = true;
    }
</script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="caution" runat="server"></asp:Label>
        <asp:button Text="Click" id="testbutton" runat="server" OnClientClick="ShowThis(this);"/>    </div>
    </form>
</body>

(default.aspx.vb)

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub HereClick(ByVal sender As Object, ByVal e As EventArgs) Handles testbutton.Click
        Me.caution.Text = "Click"
    End Sub
End Class

ボタンの二度押しを禁止する場合を単純に考えた場合、

  1. Submitボタンをクリックしたのち
  2. クライアントサイドで、そのボタンのdisabled=true
  3. PostBackされる
  4. 再表示されると、特に何もしなければdisable=false

となる予定だった。そう思っていたのだけど、クライアントサイドで、Submitボタンに対してonClickイベント中にボタンを使用不可にすると

その後はPostBackされない。

 クライアントサイドのShowThis内のown.disabled=true;がない場合であれば、予想通りの動きになる。

  これを回避するためには、次のように、ClientScriptManager.GetPostBackEventReferenceを使う。

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub HereClick(ByVal sender As Object, ByVal e As EventArgs) Handles testbutton.Click
        Me.caution.Text = "Click"
    End Sub


    Protected Sub Page_PreRenderComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRenderComplete
        Dim cSM As ClientScriptManager = Page.ClientScript
        Me.testbutton.Attributes.Item("OnClick") = cSM.GetPostBackEventReference(Me.testbutton, ””).ToString()

    End Sub
End Class

これはASP.NET自体の問題というわけではなく、Perlなどを利用したWebアプリであろうが、同様なことが発生する。

つまり、Submitボタンで、disabled = tureとしたとき、Submitイベントが起きなくなるということだ。
例えば、http://www.willmaster.com/possibilities/archives/wmp20040928001.shtml
#この場合は、SubmitではなくButtonを使え、ということになる

あ、ちなみに、色々と調べると参考になるようなものは転がっているはずだが、クライアントサイドのみで解消する方法は
ちょっとみつからなかった。もし、知っている人がいたら、教えてください。

投稿日時 : 2007年11月23日 13:21

コメント

# re: ASP.NET ボタンの二度押し禁止 2007/11/23 18:56 けろ
Ajax使えばいいだけのような...
以前、この件で、ネタ書いてます

http://blogs.wankuma.com/mymio/archive/2007/06/24/81987.aspx
http://techbank.jp/vbnet/SessionPageStatePersister.html

ご参考までに。

# re: ASP.NET ボタンの二度押し禁止 2007/11/23 20:17 Moo
F5問題(同一内容の再ポスト)があるので
サーバサイドのチェックも検討してみてください。

# re: ASP.NET ボタンの二度押し禁止 2007/11/23 22:31 Mr.T
>Ajax使えばいいだけのような...
>以前、この件で、ネタ書いてます
ネタがかぶったのはご愛嬌ということで(^^;
情報ありがとうございます。

Ajaxだと、完全にクライアントサイドでの処理でできますね。Requestの最初と最後で制御を加えるって形だから、そっちの方が制御としては厳密なのかな?
ところで、ボタンをダブルクリックっぽく押した時って、問題ないですかね?
ボタンが使用禁止になる前にボタンが押せたりすると、私の方法じゃだめなんですけどね。

ちなみに、けろさんの記事に多重クリックって書いてあるんですが、私は二度押しってことで調べてました。
似たような件で調べる人がいたときに、「二度押し」では、検索ではせっかくのエントリが出てこないのではないかと、老婆心ながら思ってしまいました。
#って、そりゃオレもか。

# re: ASP.NET ボタンの二度押し禁止 2007/11/23 22:42 Mr.T
>F5問題(同一内容の再ポスト)があるので
サーバサイドのチェックも検討してみてください。
これはつまり、サーバ側でフラグを持たせてそれをチェックするってことですよね?
再ポストができないようにするには、そのチェックは確かに必要ですね。
ありがとうございます。

そうか、今更気がついたけど、ボタンの使用禁止は、二重送信の禁止させるという意味と、
今このボタンは押せないんだ、とユーザに知らせるための意味と二つあるんじゃないかな?
#ううむ、違うかな...?

# re: ASP.NET ボタンの二度押し禁止 2007/11/24 0:00 中博俊
フラグではなくトークンですね。
基本はページを発行する際にGUIDを与えて、そのGUIDがサーバ側で一致する処理しかしないというのを基本とします。
どうせクライアントなんて全く信用に値しませんし。


Post Feedback

タイトル
名前
Url:
コメント