Asp.net 在ASP母版页中使用AJAX刷新数据

Asp.net 在ASP母版页中使用AJAX刷新数据,asp.net,ajax,vb.net,webforms,Asp.net,Ajax,Vb.net,Webforms,我有一些进程作为后台作业运行,允许用户继续使用页面,当作业完成时(可能需要几分钟),我想向用户显示一条消息,最好的显示位置是母版页AFAIK(万一它们在站点上从一页移动到另一页)因此,我在母版页文件中定义了一个div 我正在试图找到显示数据的最佳方法,目前我在masterpage vb文件中有一种方法,可以轮询数据库,查看作业(涉及复杂的逻辑和一些db访问)是否已完成,如果已完成,则在div中显示一条消息,例如“job 13132已完成”-效果良好 问题是这不是动态的,我必须刷新页面以调用检查流

我有一些进程作为后台作业运行,允许用户继续使用页面,当作业完成时(可能需要几分钟),我想向用户显示一条消息,最好的显示位置是母版页AFAIK(万一它们在站点上从一页移动到另一页)因此,我在母版页文件中定义了一个div

我正在试图找到显示数据的最佳方法,目前我在masterpage vb文件中有一种方法,可以轮询数据库,查看作业(涉及复杂的逻辑和一些db访问)是否已完成,如果已完成,则在div中显示一条消息,例如“job 13132已完成”-效果良好

问题是这不是动态的,我必须刷新页面以调用检查流程是否已完成的函数,如何使用AJAX每5秒自动交付此内容

我曾尝试使用一个asp计时器,计时时间为5秒,但整个页面每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文本?

最常见的方法是创建一个单独的页面来呈现JSON或HTML。这就是“poll_result”方法,可以将其看作poll_result.aspx。您可以将单个作业ID传递到此页面,也可以只对自上次轮询以来已完成的任何作业进行轮询


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

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

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

Public子进程请求(Byval上下文作为HttpContext)
Dim r As String=“”
如果dbtable.isCompleted=True
使某人成为新的架线工
r=“作业abc123已完成”
如果结束
context.Response.ContentType=“text/plain”
context.Response.Write(r)
}
现在您已经完成了服务器部分,让我们来完成客户端部分,在您的页面中,将此jQuery代码添加到tour masterpage,每当有人刷新页面时,witch就会启动,或者您可以使用
setInterval()
每隔xx秒检查一次:


var checkJobs=true;
$(文档).ready(函数(){
//每次有人刷新页面时
checkPendingJobs();
//每5秒。。。
setInterval(函数(){checkPendingJobs();},5000);
});
函数checkPendingJobs(){
//如果我们已经有了一个有效的响应,则无需检查它
如果(!checkJobs)返回;
//缓存问题技巧
var now=新日期();
$.ajax({
url:“../async/checkPendingJobs.ashx”,
键入:“获取”,
数据:{t:now.getTime()},
成功:功能(数据){
//我们有文本要显示吗?
如果(data.length>0){
警报(数据);
checkJobs=false;//无需进一步检查。。。
//$('#status').html(数据);
}
},
错误:函数(msg){
警报('发现错误:\n'+msg);
}
});        
}

您提到ASP母版页,但您标记了
ASP.NET
,这是一个
ASP.NET Webforms
项目吗?您好,是的,这是一个基于ASP.NET Webforms的项目。您好,非常感谢您发布此代码,很抱歉,这让我很痛苦,但我已经复制并粘贴了此代码,只是为了在进行任何更改之前进行测试,但是我在javascript错误控制台中遇到以下错误。。错误:missing}after property list-LINE=>success:function(data){我看不到缺少任何内容,但以前没有这样做过,因此无法确定是否需要添加一些内容?缺少一个
}
来关闭
.ajax()
调用,还有一个逗号
。。。很抱歉,答案中的代码被编辑了,您可以安全地复制/粘贴,请测试VB代码,在C#中使用了这么多年,以至于我忘记了VB:o中的基础知识(