在ASP主页中使用AJAX刷新数据

时间:2012-01-16 15:30:42

标签: asp.net ajax vb.net webforms

我有一些作为后台作业运行的进程,允许用户继续使用页面,当作业完成时(可能需要几分钟)我想向用户显示消息,最好的地方显示这将是主页AFAIK(如果他们在网站上从一个页面移动到另一个页面),所以我在主页文件中定义了一个div。

我正在尝试找到显示数据的最佳方法,目前我在masterpage vb文件中有一个方法,该方法轮询数据库以查看作业(涉及复杂逻辑和某些数据库访问)是否已完成,如果有,它会在div中显示一条消息,例如“工作13132已经完成” - 工作正常。

问题是这不是动态的,我必须刷新页面来调用检查进程是否已经完成的函数,我如何使用AJAX每5秒自动传送一次这个内容?

我尝试使用具有5秒滴答时间的asp计时器,但整个页面每5秒钟会在计时器点击事件中刷新。

Protected Sub Timer1_Tick(Byval sender as Object, Byval e As EventArgs)
    poll_results()
End Sub

Public Sub poll_results()

 'database access logic 

 If dbtable.isCompleted = True
     Dim sb As New StringBuilder()
     sb.Append("$('#status').html('Job abc123 is complete');")
     Page.ClientScript.RegisterStartupScript(GetType(Page), "myscript", sb.ToString(), True)
 End If

End Sub

有没有办法只使用更新的消息刷新div,而不使用此代码进行完全刷新?或者,如果这是不可能的,有没有办法使用jQuery复制上述函数,并且只有在作业完成后才能更新DIV文本?

2 个答案:

答案 0 :(得分:0)

最常见的方法是创建一个将呈现JSON或HTML的单个页面。这个作为“poll_results”方法,将其视为poll_result.aspx。您可以将单个作业ID传递给此页面,也可以仅对上次轮询后已完成的任何作业进行轮询。

您的主页将有一个JavaScript的snipet将使用计时器(客户端javascript计时器)向服务器发送AJAX请求,点击您的“poll_request.aspx”页面。此页面将返回HTML或JSON,您将编写一些JavaScript来显示您的消息。如果您需要一些代码示例,请告诉我。

答案 1 :(得分:0)

您可以轻松地抛出我们所谓的异步调用,而不是在同一页面中调用您的方法,只需在您的网站中创建一个async文件夹并添加一个新的通用处理程序,调用页面,例如checkPendingJobs.ashx

在该页面中,添加您当前的方法:

Public Sub ProcessRequest (Byval context as HttpContext)

    Dim r As String = ""

    If dbtable.isCompleted = True
       Dim sb As New StringBuilder()
       r = "Job abc123 is complete"
    End If     

    context.Response.ContentType = "text/plain"
    context.Response.Write(r)
}

现在您已经完成了服务器部分,让我们在您的页面中执行客户端部分,将此 jQuery 代码添加到巡视母版页中,每次都会触发一个刷新页面,或者您可以使用setInterval()每隔xx秒检查一次:

<script>

var checkJobs = true;

$(document).ready(function() {

    // every time someone refreshes the page
    checkPendingJobs();

    // every 5 seconds...
  setInterval(function(){ checkPendingJobs(); }, 5000);

});

function checkPendingJobs() {
    // no need to check it if we already have a valid response
    if(!checkJobs) return;

    // caching issue trick
    var now = new Date(); 

    $.ajax({
        url: "../async/checkPendingJobs.ashx",
        type: "GET",
        data: { t: now.getTime() },
        success: function(data) {

            // do we have text to show?
            if(data.length > 0) {
                alert(data);
                checkJobs = false; // no need to check it more...
                // $('#status').html(data);
            }
        },
        error: function(msg) {
            alert('Error found:\n' + msg);
        }
    });        
}

</script>