- PR -

ASP.NETでのダブルクリック制御

投稿者投稿内容
なな
ベテラン
会議室デビュー日: 2003/09/18
投稿数: 79
投稿日時: 2004-03-18 21:36
いつも参考にさせていただいてます。
現在ASP.NETで開発を行っております。
その中でデータベースに画面上のデータを更新するような処理(登録画面処理)を
作成しています。
登録ボタンを押してからデータベースにデータを登録し、
COMMITし、処理が正常に終了した後に登録ボタンをEnable = False
にするプログラムを組んでいます。
その中でダブルクリックをしてしまうと、登録対象となるテーブルのキーの設定上、
同じデータを2重で登録してしまうことも可能になってしまうのです。
もしくは回線の関係上、処理に時間がかかってしまい、処理してる間に
ユーザーが何度も登録ボタンをクリックしてしまう、などもクリックしただけ
データが登録されてしまいます。
過去のスレッドも同じような内容のものがあったのですが↓

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=4355&forum=7

ASP.NETで実現する場合はどうしたら良いのか、正直検討がつきません。
サーバー側で無理な場合はどのように行ったら良いのでしょうか?
どなたかご教授願います。

きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-03-19 08:54
ななさん、お早うございます。

ここで私が示している方法が使えるかも知れません。ブラウザの「戻る」ボタンを使われた際に、更新系の処理が二重に走らないための防御策として提案していますが、「更新」ボタンとかダブルクリックに対しても有効と思われます。
また、ここで顔爺さんが提案している方法も応用できるかも知れません。
根性
常連さん
会議室デビュー日: 2004/03/10
投稿数: 39
投稿日時: 2004-03-19 10:35
登録ボタンをクリックする後に、確認のメッセージを表示しますか。
_________________
根性
常連さん
会議室デビュー日: 2004/03/10
投稿数: 39
投稿日時: 2004-03-19 11:20
例えば登録ボタンのIDはbtn_new

<body leftMargin="0" topMargin="0" rightMargin="0" onbeforeunload="DisableButton()">

その中にonbeforeunload="DisableButton()"を追加します。

JavaScriptでfunction DisableButton()を追加します。
function DisableButton()
{
   if (window.event.srcElement.id == "btn_new")
{
  document.getElementById("btn_new").disabled = true;
}
}

確認のメッセージが欲しいであれば、
*.aspx.csでPage_Loadに
btn_new.Attributes.Add("onclick","return (confirm(登録しますが、いいですか?))");
を追加します。
_________________
なな
ベテラン
会議室デビュー日: 2003/09/18
投稿数: 79
投稿日時: 2004-03-19 12:28
きくちゃんさん、泳げないさん
返答ありがとうございました。
まず、泳げないさんがかかれていた↓

引用--------------------------------------------------------------

登録ボタンをクリックする後に、確認のメッセージを表示しますか。

--------------------------------------------------------------
登録ボタン押下時に確認メッセージは出しません。
場合によっては一日に何千件のデータを登録するので
メッセージは出さないつもりです。
そしてきくちゃんさんに教えていただいた過去のスレッドを拝見したところ
顔爺さんの案(Optimistic Offline Lock を使ってバージョン番号取得)
ですがトランザクションテーブルの1意のデータをSELECTし、それを画面で修正し、
登録ならばそれも良いかもしれませんが、それぞれのデータをすべて別々のマスタから
別々にSELECT文を実行して持ってきているのです。
(登録画面のテキスト(入力)部分すべてにマスタ参照子画面が設定されていて、それを
ひとつずつ入力して新規データを登録する、というかんじの画面です。
うーん、説明が悪くて申し訳ありません。)
セッションやアプリケーションで排他利用ともありますがあくまで
同じデータが同じクライアントから送られてきた時のみ、無効としたいのです。
アプリケーション変数を使ってクライアントのIPアドレスを取得して
それをどこかに保持し、
COMMITが切られるまえにもう一度同じクライアントから登録の
アクションを受けた時は保持していたIPアドレスと同じユーザーが来た!ということで
後者の登録処理は無効、そんな感じに出来ればベストなんですが・・。
セッションやアプリケーションだとプログラム動かしている人すべてで共有するものなので
それも無理だし・・。
クライアントで個々に持ちたいならCookieって案しかないのでしょうか?




NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-03-19 12:36
NAL-6295です。

もし、単純にボタンの2重クリックを防ぎたいという事であれば、

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9333&forum=7

なんかが参考になると思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-19 13:18
引用:

ななさんの書き込み (2004-03-19 12:28) より:

セッションやアプリケーションだとプログラム動かしている人すべてで共有するものなのでそれも無理だし・・。


 ん?セッションは「通信単位」ですよ?たとえば、1つのブラウザから、スクリプトで分岐(新しく開いた)フォームは、同じセッションです。しかし、ブラウザを新しく起動した場合は、別セッションになります。
 同じく、複数のクライアントで起動しているブラウザからの要求は、別セッションになります。


かぶった
引用:

ただ、IEの場合、同じショートカットから起動したり、メニューの[ファイル]-[新規作成]-[ウィンドウ]とかで複数のブラウザウィンドウを開くと共有されてごっちゃになってしまいますが。


 「IEの場合」と言うことは、他のブラウザでは挙動が異なると言うことでしょうか?

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-19 13:25 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-03-19 13:19
ななさん、こんにちは。

引用:

セッションやアプリケーションだとプログラム動かしている人すべてで共有するものな


一つ誤解があるようですが、セッションはまさしくそのセッションだけで有効であり、他のユーザと共有されるものではありません。ただ、IEの場合、同じショートカットから起動したり、メニューの[ファイル]-[新規作成]-[ウィンドウ]とかで複数のブラウザウィンドウを開くと共有されてごっちゃになってしまいますが。

カウンタチェックの具体的な方法ですが、初回のページ表示の際にセッションとビューステートに値 1 のカウンタを持たせて、ポストバックされるたびに、例えばLoadイベントあたりで値を比較します。問題がなければ双方をインクリメントし、問題があればボタンクリックなどのデータ更新を行うイベントハンドラを無効にして、メッセージを表示します。

スキルアップ/キャリアアップ(JOB@IT)