决战.NET
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 UpdateProgress控件

当使用者点击了UpdatePanel控件中会触发Async-Postback动作的控件,或者点击Triggers中所设定的控件而导致UpdatePanel控件刷新时,若整个刷新动作需耗费较长时间,整个网页会呈现停滞状态,使用者虽然仍可操作网页上的其他控件,但感觉上总是不太对,尤其是这极可能会引发前面所提及的,遗失前次Async-Postback刷新动作的问题。这时设计师可利用ASP.NET AJAX所提供的UpdateProgress控件,提供一个进度行或信息,提醒用户目前的状态是正在处理要求中。使用UpdateProgress控件的步骤很简单,请照着下列步骤做。

1. 创建一个新网页,命名为UpdateProgressTest.aspx。

2. 在页面中放入ScriptManager控件。

3. 放入UpdatePanel控件,命名为UpdatePanel1。

4. 将UpdatePanel1控件的UpdateMode设为Conditional。

5. 在UpdatePanel1控件中放入一个Button控件,命名为Button1。

6. 在Button1控件的Click事件中键入程序3-5的代码。

7. 放一个UpdateProgress控件至网页中(请放在UpdatePanel外面),命名为Update-Progress1,设定AssociatedUpdatePanelID属性为UpdatePanel1。

8. 在UpdateProgress1控件中放入一个Label控件,命名为Label1,Text属性设为“Updating...”。

9. 整体UI界面应如图3-4所示。

true

图3-4

程序3-5

    Samples\3\AjaxDemo1\UpdateProgressTest.aspx.cs
    protected void Button1_Click(object sender, EventArgs e)
    {
        Button1.Text = DateTime.Now.ToString();
        System.Threading.Thread.Sleep(5000);
    }

程序3-5的意思是,当Button按钮被点击时,等待5000ms(5秒)后才完成Async-Postback动作,对使用者来说,在点击Button按钮后网页就会呈现停滞状态,本例以此来模拟当Async-Postback动作需较长时间来完成的情况。完成后运行程序,点击Button按钮后,便可看到Updating...信息的显示,如图3-5所示。

true

图3-5

在Async-Postback动作完成后,这个信息就会自动消失,这便是UpdateProgress控件的简单用法。

加入Cacnel功能

视需求而定,使用者也许会有在Async-Postback期间取消整个动作的需求,此时除了利用UpdateProgress控件来显示信息外,同时也必须提供取消动作的按钮,ASP.NET AJAX并未提供简便的方法来达到此需求,这得与ASP.NET AJAX提供的AJAX Client Framework合作方能达成,请照着下列步骤做。

1. 创建一个新网页,命名为UpdateProgressWithCancel.aspx。

2. 在页面中放入ScriptManager控件。

3. 放入UpdatePanel控件,命名为UpdatePanel1。

4. 将UpdatePanel1控件的UpdateMode设为Conditional。

5. 在UpdatePanel1控件中放入一个Button控件,命名为Button1。

6. 在Button1控件的Click事件中键入程序3-6的代码。

7. 放一个UpdateProgress控件至网页中(请放在UpdatePanel控件外面),命名为UpdateProgress1,设定AssociatedUpdatePanelID属性为UpdatePanel1。

8. 在UpdateProgress1控件中放入一个Label控件,命名为Label1,Text属性设为“Updating...”。

9. 切换到网页源码页面,键入程序3-7 中粗体字的JavaScript程序代码,放入一个HTML Button控件至UpdateProgress控件内。

程序3-6

    Samples\3\AjaxDemo1\UpdateProgressWithCancel.aspx.cs
    protected void Button1_Click(object sender, EventArgs e)
    {
            Button1.Text = DateTime.Now.ToString();
            System.Threading.Thread.Sleep(5000);
    }

程序3-7

    Samples\3\AjaxDemo1\UpdateProgressWithCancel.aspx
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile=
      "UpdateProgressWithCancel.aspx.cs" Inherits="UpdateProgressWithCancel" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.
      w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
            <script language=javascript>
            //取得PageRequestManager对象,每一个ASP.NET AJAX页面中会有唯一一个这种对象
            //负责处理所有的Async-Postback要求
            var prm = Sys.WebForms.PageRequestManager.getInstance();
            //新增事件处理至PageRequestManger的initializeRequest事件,
            //当Async-Postback发生时,此事件会被触发,我们的InitRequest函数便会被运行.
            prm.add_initializeRequest(InitRequest);
            //新增事件处理至PageRquestManager的endRequest事件,
            //当Async-Postback完成时,此事件会被处发,我们的EndRequest函数便会被运行.
            prm.add_endRequest(EndRequest);
            function InitRequest(sender,args)
            {
              //显示出UpdateProgress1控件
              document.getElementById("UpdateProgress1").style.display="block";
            }
            function EndRequest(sender,args)
            {
              //隐藏UpdateProgress1控件
              document.getElementById("UpdateProgress1").style.display="none";
            }
            //用于取消Async-Postback动作
            function CancelClick()
            {
              //当处于Async-Postback动作时,get_IsInAsyncPostback函数会回传true,
              //此时调用abortPostback函数便会取消Async-Postback动作.
              if (prm.get_isInAsyncPostback()) {
                    prm.abortPostback();
                }
            }
            </script>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode=
              "Conditional">
                  <ContentTemplate>
                    <asp:Button ID="Button1" runat="server" OnClick=
                      "Button1_Click" Text="Button" />
                  </ContentTemplate>
            </asp:UpdatePanel>
        </div>
          <asp:UpdateProgress ID="UpdateProgress1" runat="server">
            <ProgressTemplate>
            <asp:Label ID="Label1" runat="server" Text="Updating...."></asp:Label>
            <input type=button name="btnCancel" value="Cacnel" onclick="CancelClick()"/>
            </ProgressTemplate>
          </asp:UpdateProgress>
        </form>
    </body>
    </html>

运行此程序并点击Button按钮后,会发现“Updating...”信息已经显示,旁边还有个Cancel按钮,点击后便可取消这整个Async-Postback动作,如图3-6所示。

true

图3-6

请注意,具体来说,调用abortPostback函数的用意是放弃Async-Postback时的刷新UpdatePanel控件动作,对于Server端来说,整个Async-Postback动作还是会运行完,所以用取消这个字眼其实并不太正确,应该说是放弃Async-Postback后的刷新动作较为贴切。