<asp:Button ID="btnExport">
UpdatePanel 内にコントロールがあります。そのボタンをクリックすると、すぐに Javascript 関数を実行したいと思います (これは、UpdatePanel がポストバックを実行している間、継続的に実行されるポーリング関数です)。これどうやってするの?
私はこれを試しました:
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(pageLoaded);
function pageLoaded(sender, args) {
$(".btnExport").click(function (e) {
timer = window.setInterval(pollStatus, 1000);//
});
}
これは機能しますが、btnExport イベント ハンドラーを実行しません。私が試したことはすべて、ポーリング関数ではなくイベントハンドラーを実行するか、またはその逆です。私が本当に探しているのは、これを行う方法です:
1) [エクスポート] ボタンをクリックします。
2) タイマーを設定して、毎秒ポーリング イベント (JavaScript 関数) を実行します。
3) [エクスポート] ボタンのイベント ハンドラーを実行します。
4) ポストバックが完了したら、タイマーをクリアします。
これを達成するための最良の方法について何か提案はありますか?
ここにいくつかのサンプルコードがあります。これは、ポイントを説明するためだけに作成した小さなサンプル アプリケーションからのものです。実際のアプリは、ここに投稿するには少し複雑すぎます。
DEFAULT.ASPX
<asp:ScriptManager runat="server" ID="ScriptManager1"></asp:ScriptManager>
<asp:UpdatePanel runat="server" ID="UpdatePanel1">
<ContentTemplate>
<asp:Button runat="server" ID="btnExport" Text="Begin Export" OnClick="btnExport_Click" ClientIDMode="Static" /><div id="message"></div>
</ContentTemplate>
</asp:UpdatePanel>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" language="javascript">
var timer;
function pollStatus() {
$.ajax({
type: "POST",
url: "<%= Page.ResolveUrl("~/Default.aspx/PollStatus") %>",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
$("#message").html(response.d);
}
});
}
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(pageLoaded);
function pageLoaded(sender, args) {
$("#btnExport").click(function (e) {
timer = window.setInterval(pollStatus, 50);
});
}
</script>
DEFAULT.ASPX.CS
protected void btnExport_Click(object sender, EventArgs e)
{
for (int i = 1; i <= 10000000; i++ )
{
Session["PollStatus"] = i;
}
}
[WebMethod]
public static string PollStatus()
{
return HttpContext.Current.Session["PollStatus"] != null ? HttpContext.Current.Session["PollStatus"].ToString() : "No result";
}