2

<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";
        }
4

3 に答える 3

1

ここで指定された css クラスが表示されません。

<asp:Button ID="btnExport">

ただし、セレクターはクラスごとにオブジェクトを取得しようとしています:

$(".btnExport")

そのため、ボタンの CssClass プロパティを設定するか、セレクターを変更する必要があります。

UPD: このコードは私にとっては問題なく機能します (これは例です。製品を使用する前にいくつかの研磨が必要です)

<form id="form1" runat="server">

    <asp:ScriptManager runat="server" ID="scmMain"></asp:ScriptManager>

    <asp:UpdatePanel runat="server" ID="pnlMain">
        <ContentTemplate>
            <asp:Button Text="Test" ID="btnTest" CssClass="btnTest" runat="server" OnClick="btnTest_OnClick"/>
        </ContentTemplate>
    </asp:UpdatePanel>

    <script type="text/javascript">
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_pageLoaded(pageLoaded);
        var timer;
        function pageLoaded(sender, args) {
            if (prm.get_isInAsyncPostBack()) {
                window.clearInterval(timer);
            }
            else {
                $(".btnTest").click(function (e) {
                    timer = window.setInterval(pollStatus, 1000);
                });
            }
        }

        function pollStatus() {
            alert('Test');
        }

    </script>

</form>

ボタンの btnTest_OnClick サーバー側イベント ハンドラーは次のことを行います。

Thread.Sleep(5000);

サーバーがクライアントに応答を返すまで、「テスト」アラートが表示されます。

于 2012-05-18T21:18:28.200 に答える
0

あなたはこれを試すことができます

Javascript:

<script type="text/javascript">
    var timer;

    function fn() {
        //alert('hi');
        //clear the timer here.
    }
    function fn2() {
        //alert('hello');
        //Set a timer to do a polling event here
        return true;
    }
</script>

HTML:

<asp:Button ID="btnExport" runat="server" Text="Begin Export" OnClientClick="return fn2();" onclick="btnExport_Click" />  

コードビハインド:

protected void btnExport_Click(object sender, EventArgs e)
    {
        for (int i = 1; i <= 10000000; i++ )
        {
            Session["PollStatus"] = i;
        }

        string myScript = @"fn();";
        Page.ClientScript.RegisterStartupScript(this.GetType(), "MyScript", myScript, true);
    }  

お役に立てれば。幸運を。

于 2012-05-18T21:41:22.440 に答える
0

例のようにintervalを使用すると、リクエストがサーバーから戻るまでに時間がかかるため、多数の同時ポーリングリクエストが発生します。再試行する前に、最後のポーリング要求がサーバーから返されるのを待つ必要があります。

function poll() {
    $.ajax({
        type: "POST",
        url: "<%= Page.ResolveUrl("~/Default.aspx/PollStatus") %>",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            if (response.d != 'No Result') {
                // done
            } else {
                setTimeout(poll, 50);
            }
        }
    }); 
}

$(function() {
    $("#btnExport").click(function (e) {
        poll();
    });
});
于 2012-05-21T11:53:40.273 に答える