トップ回答者
Timerがバックグランドで処理するページ内で確認メッセージを表示する方法

質問
-
Asp.NetにてWebアプリケーションの開発を行なっているのですが、
ボタン押下時に確認メッセージを表示したいです。ページロードイベント中に"onclick"時の処理を登録する
ことで実現できそうなのですが、
[OK]ボタンを押しても処理が行なわれない時があります。バックグラウンドでTimerが動作していることが
原因ではないかと思うのですが、
回避策が思いつかない状態です。Timerがバックグランドで処理するページ内で
確認メッセージを表示する方法がありましたらご教授頂きたいです。本現象の確認は以下の環境を行いました。
OS :Windows2008R2
IDE :Visual Studio2010 SP1
プロジェクトテンプレート:ASP.NET 空のWeb アプリケーション(C#)
aspx(デザイン)
--
ScriptManager
UpdatePanel
Timer
Button
--cs(コード)
--
protected void Page_Load(object sender, EventArgs e)
{
Button1.Attributes["onclick"] = "return confirm('確認メッセージのテストです。');";
}protected void Timer1_Tick(object sender, EventArgs e)
{
//Timer処理
}protected void Button1_Click(object sender, EventArgs e)
{
//本処理
}
--
よろしくお願いします。
回答
-
> [OK]ボタンを押しても処理が行なわれない時があります。
Timer も Button も UpdatePanel のトリガとして使用されていて、非同期
ポストバックがかかるのですよね?そうだとするとタイミングの問題ではないかと思います。
即ち、例えば、Bottun をクリックでポストバックがかかるが、応答が帰っ
てこないうちに Timer でポストバックされ、「Timer 処理」の結果しか帰
ってこないからではないでしょうか?PageManagerRequest クライアントオブジェクトを利用して、すでに実行中
のリクエストが終了するまで、他のリクエストをキャンセルするように実装
してはいかがですか。- 編集済み SurferOnWww 2011年6月6日 13:27 誤記訂正
- 回答としてマーク ゴートラ 2011年6月8日 6:10
すべての返信
-
> [OK]ボタンを押しても処理が行なわれない時があります。
Timer も Button も UpdatePanel のトリガとして使用されていて、非同期
ポストバックがかかるのですよね?そうだとするとタイミングの問題ではないかと思います。
即ち、例えば、Bottun をクリックでポストバックがかかるが、応答が帰っ
てこないうちに Timer でポストバックされ、「Timer 処理」の結果しか帰
ってこないからではないでしょうか?PageManagerRequest クライアントオブジェクトを利用して、すでに実行中
のリクエストが終了するまで、他のリクエストをキャンセルするように実装
してはいかがですか。- 編集済み SurferOnWww 2011年6月6日 13:27 誤記訂正
- 回答としてマーク ゴートラ 2011年6月8日 6:10
-
SurferOnWwwさんありがとうございました。
ご助言頂いたPageRequestManagerオブジェクトを利用することで、
解決致しました。対応方法としては、
確認メッセージを表示する直前で、他の非同期ポストバックを中断する処理を
追加しました。aspx(デザインソース)
--
<script type="text/javascript">
function CancelAsyncPostBack() {
var prm = Sys.WebForms.PageRequestManager
.getInstance();
if (prm.get_isInAsyncPostBack()) {
prm.abortPostBack();
}
}
</script>
--cs(コード)
--
protected void Page_Load(object sender, EventArgs e)
{
//Button1.Attributes["onclick"] = "return confirm('確認メッセージのテストです。');";
Button1.Attributes["onclick"] = "CancelAsyncPostBack();return confirm('確認メッセージのテストです。');";
}protected void Timer1_Tick(object sender, EventArgs e)
{
//Timer処理
}protected void Button1_Click(object sender, EventArgs e)
{
//本処理
}
--