- - PR -
Clickイベントを破棄できますか?
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-01-14 21:30
LoadViewStateと、ポストデータを読み込むところでなんかやると、いけるかも。 Webアプリの場合、「サーバで処理できるイベント」というのは基本的にないんです。なぜかというと、イベントが発生するのはクライアントだからです。クライアントから、「このコントロールの、このイベントが発生した」という情報をsubmit(提出)して初めて、サーバが処理できるのです。サーバが処理するのは、ビューステートの情報とポストデータの情報を調べて行いますから、これらの情報を読み込むところで無視するようなことをすれば、イベントハンドラに処理が移行しなくなると思います。 あったあった。MSDNの目次から、 「VisualStudio.NET→.NET Framework→アプリケーションの構築→ASP.NET Webアプリケーションの作成→ASP.NETサーバーコントロールの開発→ポストバックイベントのキャプチャ」 [ メッセージ編集済み 編集者: Jitta 編集日時 2004-01-14 22:05 ] 注意の追加 ポストバックデータを読むメソッド(オーバーライドして実装する)は、Page_Loadイベントよりも前に発生します。だから、RaisePostBackEvent メソッド (IPostBackEventHandler が実装されている場合)で処理する方がよいかも?? [ メッセージ編集済み 編集者: Jitta 編集日時 2004-01-15 08:25 ] | ||||
|
投稿日時: 2004-01-15 10:33
Jittaさん、ありがとうございます。
早速試してみます。 | ||||
|
投稿日時: 2004-01-15 21:42
ふと思ったのですが、Click イベントを初めからハンドリングしないで Click イベントの処理を別のメソッドに変えて、 Page_Load 内でそれを呼ぶ、というのはどうでしょうか? #いまいちイベントのキャンセルにこだわっている理由が分からないのですが。。。 | ||||
|
投稿日時: 2004-01-16 08:50
ああ、その手がありましたね。 VB.NETの様ですが、Handles以降を消しておいて、Page_Loadの中で呼びたいときはAddHandlerする、という手がありますね。ハンドラが定義されていなければ、発生しても捨てられますから。 > #いまいちイベントのキャンセルにこだわっている理由が分からない 同じく。 | ||||
|
投稿日時: 2004-01-16 09:58
架空兎さん、Jittaさん、こんにちは。
そうですよね・・・。 そもそも、ブラウザの更新ボタン(F5)を押された時の動きとして、 一つ前のPOSTが再送されるという問題を抱えていました。 例えば、 1回目:ボタンクリック時の動き ・ Page_Load() ・ Button1_Click() 2回目:更新ボタン(F5)押下時の動き(1回目と同様の動き) ・ Page_Load() ・ Button1_Click() と更新ボタン(F5)を押すと、前回の動きをもう一度繰り返してしまうので、 更新ボタン押下の場合は何もさせたくないというのが、やりたいことでした。 F5が押されたかどうかの判別を、 Clickイベント内に書けばいいのですが、 もう既に作られてしまったプログラムを修正する方法としては、 可能であればPage_Load()などで破棄するのが適切かと考えていました。 そのため、Clickイベントが発生する前にClickイベントをキャンセルしたい という質問ができてしまったのです。 最初からこのような質問をすればよかったですね・・・。 申し訳ありません。 | ||||
|
投稿日時: 2004-01-19 18:22
もしdocument.keyDownを使っていないのであれば、ページのロードもしくは、
プリレンダーで、 Response.write をつかって下のスクリプトを書いちゃえばいいと 思いますよ。 (下記をStringに手動で直してください。) <script> function f5Cancel() { if(event.keyCode == 116){ event.keyCode = 0; return false; } } document.onkeydown = f5Cancel; </script> もし、すべてのページ、同じクラスを継承しているんなら話は早いと思います。 protected override void OnPreRender(EventArgs e) { base.Response.Write("さっきのスクリプト"); base.OnPreRender(e); } ってやれば、全ページに設定できるとおもいます。 ソースがC#ですみません。 |