1.4 UpdateProgress控件
UpdateProgress控件可与UpdatePanel配合,用来显示目前异步Postback的处理状况,或是将进行中的异步Postback取消。
您可以在页面上布置了UpdatePanel后,再放入一个UpdateProgress控件,如图1-37所示。
图1-37
您也可以把UpdateProgress放在UpdatePanel之外,如果该UpdateProgress是放在任何UpdatePanel之外(如图1-37),请务必设置其AssociatedUpdatePanelID属性,将UpdatePanel与UpdateProgress相结合。(若UpdateProgress放在UpdatePanel之内,则不需要特别设置)。
完成之后,我们可以Double-Click读取数据,撰写下面的代码:
EX:PrimerAJAX/UpdateProgress/Demo01.aspx.vb
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'停顿5秒钟
System.Threading.Thread.Sleep(5000)
'刷新TextBox内的文字
Me.TextBox1.Text = Now
End Sub
接着,您可以试着执行此页面,由于我们通过Sleep(5000)代码让系统先停顿5秒钟,因此TextBox的内容不会立刻刷新(因为后端动作尚未完成),但是UpdateProgress中的内容“数据读取中…“却会显示出来,如图1-38所示。
图1-38
直到5秒钟过后,整个异步Postback完成,数据被刷新到TextBox中,并且UpdateProgress中的内容“数据读取中…“也随之消失,如图1-39所示。
图1-39
从上面这个范例中您可以发现,UpdateProgress可以在异步Postback过程当中,让客户端的页面上呈现出信息,避免异步Postback可能导致的长时间运算造成客户以为程序当掉的问题。
例如如图1-40所示的这个网页,是中国台湾知名的在线地图网站,您会发现在文字方块中点击搜索按钮之后,系统会开始搜索特定地点的地图,并呈现在页面上,在后端服务器运算(搜索)的过程中,系统也会在界面的右上角显示出“Loading”,告诉用户目前在运算当中,提醒用户不要关闭浏览器。
图1-40
备注
这项功能在我们利用UpdatePanel进行异步Postback的时候相当好用,因为并非每个Server端的事件都能够在短时间内回应,有时候大量数据的读取或是运算,需要花掉数秒钟的时间。加上网际网络带宽的不确定性,因此在异步刷新数据时,确实需要告诉用户目前的状况,以避免客户误会程序没有运作而直接关闭浏览器。
同样的,若后端服务器实在运算(搜索、或处理)太久,我们是否可以允许用户从前端中止这样的异步Postback呢?答案当然是可行的。
请参考如图1-41所示的网页。
图1-41
在页面的UpdateProgress当中,我们插入了一个STOP按钮,这个按钮只是一个单纯的HTML Button,接着我们撰写这样的JavaScript代码:
EX: PrimerAJAX/UpdateProgress/Demo02.aspx
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
<ProgressTemplate>
数据读取中...
<input type="button" value="STOP" onclick="if (Sys.
WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) { Sys.
WebForms.PageRequestManager.getInstance().abortPostBack(); }" />
</ProgressTemplate>
</asp:UpdateProgress>
请注意上方标识的部分,当点击该HTML按钮之后,会执行到下面的JavaScript程序:
if (Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {
Sys.WebForms.PageRequestManager.getInstance().abortPostBack();
}
其中的“Sys.WebForms.PageRequestManager.getInstance()”是ASP.NET AJAX Client-Script Library提供的功能,可以获取目前网页上前端“PageRequestManager”对象,通过该对象,我们可以判断目前是否正在进行异步Postback(利用get_isInAsyncPostBack()方法),也可以中止它(利用abortPostBack())。
如此一来,当客户在等候异步Postback的过程当中,若不耐烦长时间的运行时,可以通过点击“STOP”按钮来停止此次的异步Postback动作,如图1-42所示。
这个功能让我们在异步的Postback机制当中,有着更佳的控制性。