代码之家  ›  专栏  ›  技术社区  ›  Tim Meers

如何从jqueryajax调用向UI反馈代码隐藏过程的当前进度

  •  2
  • Tim Meers  · 技术社区  · 16 年前

    我有一个窗体将要执行一个失败的长时间运行的进程。安装过程中不仅需要很长时间,而且需要很多小步骤。我尽量避免在我的整个应用程序中使用内置的msajax,但如果这是一种更简单的方法,我会在本页中使用它。

    <head runat="server">
        <title></title>
        <script type="text/javascript">
            $(function() {
                $(this).find("#submitForm").click(function() {
                    RunCodeBehind();
                });
            });
    
            function RunCodeBehind() {
                $.ajax({
                    error: function(msg) { alert(msg) }, 
                    type: "POST",
                    url: 'Other.aspx/RunLongRunningProcess',
                    data: "{}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(responses) {
                        if (responses.d != "") {
                            //Display process in UI
                            var divEvents = document.getElementById("events");
                            divEvents.innerText = divEvents.innerText + "\n" + data;
                        }
                        else {
                            //no response, update as failed
                            var divEvents = document.getElementById("events");
                            divEvents.innerText = divEvents.innerText + "No response from code behind";
                        }
                    }
                });
            }
    
        </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <a id="submitForm">Start Process</a>
            <br />
            <div id="events"></div>
        </div>
        </form>
    </body>
    

    代码隐藏:

    [WebMethod]
    public static string RunLongRunningProcess()
    {
        string returnValue;
        var sqlQuery = "SELECT COUNT(*) FROM Users;"; //generic sql query
        returnValue = ExecuteQuery(sqlQuery);
    
        //feedback cout total to UI, continue process
    
        var sqlQueryInsert = @"INSERT INTO Log (UserCount) 
                                SELECT COUNT(*) FROM Users;"; //generic sql insert
        returnValue = ExecuteNonQuery(sqlQueryInsert);
    //feedback insert step to UI
        var sqlQuery = "SELECT user + ' - ' + name + ' - ' + favday FROM Users;"; //generic sql query
        returnValue = ExecuteQuery(sqlQuery);
        //feedback selection to UI
    
        return returnValue;
    }
    

    有没有关于如何让它通过一次调用多次反馈到UI的建议?

    1 回复  |  直到 15 年前
        1
  •  2
  •   user2043 user2043    15 年前

    我倾向于尝试另一种方法,而是从JQuery代码中轮询另一个web服务方法。

    在您的“runningprocess”方法中,我只需使用0到100的值更新会话整数变量。

    然后,您可以每隔( 例如 )第二步获取当前上传状态。

    我相信JQuery的PeriodicalUpdater将允许您实现以下目标:

    http://www.360innovate.co.uk/blog/2009/03/periodicalupdater-for-jquery/