2012-01-16 44 views
0

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

我想找到显示数据的最佳方法,此刻我有一个方法在masterpage vb文件中轮询数据库以查看作业(涉及复杂逻辑和某些db访问)是否已完成,如果有,它会在div中显示一条消息“Job 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 

有没有办法,只刷新与更新消息的股利,不完全刷新使用此代码发生?或者如果这是不可能的,是否有任何方法使用jQuery复制上述函数,并且只有在作业完成后才能更新DIV文本?

+0

你提到的ASP母版,但你标记'ASP.NET',这是一个'ASP.NET我们bforms'项目? – balexandre 2012-01-16 16:40:58

+0

嗨,是的,这是一个基于web.net的webforms项目。 – norbert 2012-01-16 18:27:32

回答

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> 
+0

嗨,非常感谢发布此代码,很抱歉是一个痛苦,但我已经复制并粘贴此,只是为了测试之前作出任何更改,但我在javascript错误控制台中得到以下错误.. 错误:失踪}属性列表后 - LINE =>成功:功能(数据){我看不出任何东西丢失,但以前没有这样做,所以不能确定是否有什么我需要添加? – norbert 2012-01-16 19:20:02

+0

有一个'}'缺少关闭'.ajax()'调用,以及逗号'''...对不起,代码在答案中编辑,您可以安全地复制/粘贴,并请测试VB代码,在C#中这么多年,我忘了VB的基础知识:o( – balexandre 2012-01-16 20:26:41

+0

非常感谢,它的工作完美! – norbert 2012-01-16 22:14:42

0

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

您的母版页将有一段JavaScript脚本,它将使用计时器(客户端JavaScript定时器)向服务器发送AJAX请求,并触发您的“poll_request.aspx”页面。此页面将返回HTML或JSON,您将编写一些JavaScript来显示您的消息。如果你需要一些代码样本,让我知道。