zoukankan      html  css  js  c++  java
  • ASP.NET AJAX入门系列(7):使用客户端脚本对UpdateProgress编程

     

    在本篇文章中,我们将通过编写JavaScript来使用客户端行为扩展UpdateProgress控件,客户端代码将使用ASP.NET AJAX Library中的PageRequestManager,在UpdateProgress控件中,将添加一个Button,来允许用户取消异步更新,并且使用客户端脚本来显示或者隐藏进度信息。

    主要内容

    1.通过客户端脚本取消异步更新

    2.通过客户端脚本显示或者隐藏进度信息

    一.通过客户端脚本取消异步更新

    1.创建一个Web页面并切换到设计视图。

    2.在工具箱中双击ScriptManager、UpdatePanel、UpdateProgress控件添加到页面中。添加后页面如下:

    3.在UpdatePanel控件中添加一个Label控件并设置它的Text属性值为“Panel Rendered”。

    4.添加一个Button控件并设置它的Text属性值为“refresh”。

    5.在UpdateProgress控件中添加文本text Processing…,并添加一个HtmlButton控件并设置它的Text属性为cancle。

    6.双击refresh控件添加Click事件。

    7.在Buttond的Click事件处理中添加如下代码,人为的创建一个3秒钟的延迟并显示当前服务器的时间。

    protected void Button1_Click(object sender, EventArgs e)
    {
        System.Threading.Thread.Sleep(3000);

        Label1.Text = DateTime.Now.ToString();
    }

    8.添加如下脚本,获取一个当前PageRequestManager类的实例,并创建一个函数调用abortPostBack方法来停止异步更新。

    <!-- 
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    function CancelAsyncPostBack() {

        if (prm.get_isInAsyncPostBack()) {

          prm.abortPostBack();

        }
    }
    // -->
    </script>

    9.设置HtmlButton的click特性为CancelAsyncPostBack。

    10.添加如下的样式块到<head>元素之间。


    #UpdatePanel1 {

      200px; height:100px;

      border: 1px solid gray;

    }

    #UpdateProgress1 {

      200px; background-color: #FFC080;

      bottom: 0%; left: 0px; position: absolute;

    }

    </style>

    11.保存并按Ctrl + F5运行。

    12.单击refresh按钮,经过短暂的延时之后显示进度信息,完成异步更新之后UpdatePanel中的信息显示为当前的服务器时间。

    13.单击refresh按钮并立即单击Cancle按钮结束异步更新,注意到UpdatePanel中的时间信息并没有更新。

    二.通过客户端脚本显示或者隐藏进度信息

    在下列情况下,UpdateProgress控件将不会自动显示:

        由UpdateProgress控件关联的UpdatePanel之外的控件引发的异步更新。

        UpdateProgress控件没有关联任何UpdatePanel,不在UpdatePanel中的控件引发的异步更新(例如用代码实现的更新)。

    下面的例子将展示一个不在UpdateProgress所关联的UpdatePanel中的控件所引发的异步更新时,如何显示UpdateProgress控件。

    1.在我们前面所创建的页面中,切换到设计视图。

    2.选中UpdateProgress控件,在属性窗口中,设置AssociatedUpdatePanelID属性为UpdatePanel1。

    3.在UpdatePanel和UpdateProgress控件之外添加一个Button控件。

    4.设置Button的Text属性值为Trigger,并设置ID属性为Panel1Trigger。

    5.选择UpdatePanel控件,在属性窗口中Triggers属性行单击ellipsis (…)。

    6.创建一个异步更新触发器,并设置控件ID为Panel1Trigger。

    7.双击Trigger按钮添加Click事件。

    8.在Buttond的Click事件处理中添加如下代码,人为的创建一个3秒钟的延迟并显示当前服务器的时间,并附加上一条信息表示是由触发器引发的异步更新。

    }

    9.在代码窗口,在已有的<Script>脚本块中添加如下代码:




    <!-- 

    var prm = Sys.WebForms.PageRequestManager.getInstance();

    function CancelAsyncPostBack() {

        if (prm.get_isInAsyncPostBack()) {

          prm.abortPostBack();

        }

    }

    prm.add_initializeRequest(InitializeRequest);

    prm.add_endRequest(EndRequest);

    var postBackElement;

    function InitializeRequest(sender, args) {

        if (prm.get_isInAsyncPostBack()) {

            args.set_cancel(true);
        }

        postBackElement = args.get_postBackElement();

        if (postBackElement.id = 'Panel1Trigger') {

            $get('UpdateProgress1').style.display = 'block';                

        }

    }

    function EndRequest(sender, args) {

        if (postBackElement.id = 'Panel1Trigger') {

            $get('UpdateProgress1').style.display = 'none';

        }

    }

    // -->

    </script>

    10.保存并按Ctrl + F5运行。

    11.单击Trigger按钮,如下所示:


    [翻译自官方文档]

    支持TerryLee的创业产品Worktile
    Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
    https://worktile.com
    绿色通道: 好文要顶 关注我 收藏该文与我联系
    3
    0
    (请您对文章做出评价)
    posted @ 2006-11-12 22:59 TerryLee 阅读(21407) 评论(79) 编辑 收藏
      回复引用
    #51楼 2007-10-20 11:34 testtest[未注册用户]
    真不知道前面一堆的留言回复,怎么没有一个提到这个Cancel按钮OnClick语句写错最关键的问题?所谓的这些回复,到底有多少水平。还有楼主自己仔细试验过没有
      回复引用
    #52楼 2007-11-03 16:26 菜鸟也问问题[未注册用户]
    @testtest
    你看清楚没有,楼主明明写的是onclick="CancelAsyncPostBack()" ,什么时候变成onclick="CancelAsyncPostBack"了,难道 onclick="javascript:CancelAsyncPostBack();" 不是等价于onclick="CancelAsyncPostBack()"吗?
      回复引用
    #53楼 2008-02-25 22:34 凌绝顶[未注册用户]
    我修改了一下,放在哪里都行。

    <script language="javascript" type="text/javascript">
    function CancelAsyncPostBack()
    {
    // var prm = Sys.WebForms.PageRequestManager.getInstance();
    if (prm.get_isInAsyncPostBack())
    {
    prm.abortPostBack();
    }
    }

    var prm;

    window.onload = function()
    {
    prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_initializeRequest(InitializeRequest);

    prm.add_endRequest(EndRequest);
    }


    var postBackElement;

    function InitializeRequest(sender, args) {

    if (prm.get_isInAsyncPostBack()) {

    args.set_cancel(true);
    }

    postBackElement = args.get_postBackElement();

    if (postBackElement.id = 'Button3') {

    $get('UpdateProgress1').style.display = 'block';

    }

    }

    function EndRequest(sender, args) {

    if (postBackElement.id = 'Button3') {

    $get('UpdateProgress1').style.display = 'none';

    }

    }
    </script>
      回复引用
    #54楼 2008-04-11 17:05 Microbar  
    添加的这段脚本后,一个UpdatePanel更新会导致其他UpdatePanel的UpdateProgress进度信息也会显示,如何解决啊?

    prm.add_initializeRequest(InitializeRequest);

    prm.add_endRequest(EndRequest);

    var postBackElement;

    function InitializeRequest(sender, args) {

    if (prm.get_isInAsyncPostBack()) {

    args.set_cancel(true);
    }

    postBackElement = args.get_postBackElement();

    if (postBackElement.id = 'PanelTargget') {

    $get('UpdateProgress1').style.display = 'block';

    }

    }

    function EndRequest(sender, args) {

    if (postBackElement.id = 'PanelTargget') {

    $get('UpdateProgress1').style.display = 'none';

    }

    }
    支持(0)反对(0)
      回复引用
    #55楼 2008-06-10 21:00 zagelover  
    --引用--------------------------------------------------
    阿蒙[匿名]: @Hunts.C
    我想你的原因可能是这样:

    你的ScriptManager控件放在body中
    而你的javascript代码放在了ScriptManager控件之前的位置
    因为html是逐行加载的
    由于var prm = Sys.PageRequestManager.getInstance();在加载ScriptManager控件的js代码之前就被调用了,所以就出现了Sys未定义的情况
    但是如果你把这行代码放在每个function中,或者把整段js代码放在ScriptManager控件之后,就不会出现这个问题了!
    --------------------------------------------------------

    这个好用,我试了半天,谢谢了呀
    支持(0)反对(0)
      回复引用
    #56楼 2008-06-30 22:04 veinyf#163.com[未注册用户]
    --引用--------------------------------------------------
    zagelover: --引用--------------------------------------------------
    阿蒙[匿名]: @Hunts.C
    我想你的原因可能是这样:

    你的ScriptManager控件放在body中
    而你的javascript代码放在了ScriptManager控件之前的位置
    因为html是逐行加载的
    由于var prm = Sys.PageRequestManager.getInstance();在加载ScriptManager控件的js代码之前就被调用了,所以就出现了Sys未定义的情况
    但是如果你把这行代码放在每个function中,或者把整段js代码放在ScriptManager控件之后,就不会出现这个问题了!
    --------------------------------------------------------

    这个好用,我试了半天,谢谢了呀
    --------------------------------------------------------


    !~已阅~!
    很容易范这个毛病!
      回复引用
    #57楼 2008-12-04 16:33 liqinghua[未注册用户]
    @阿蒙[匿名]
    应该就是这个原因
      回复引用
    #58楼 2008-12-30 16:34 kalin[未注册用户]
    第二个例子的源码,从ajax官方网站上看到的
    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
    System.Threading.Thread.Sleep(3000);
    Label1.Text = DateTime.Now.ToString();
    }
    protected void Panel1Trigger_Click(object sender, EventArgs e)
    {
    System.Threading.Thread.Sleep(3000);
    Label1.Text = DateTime.Now.ToString() + " - trigger";
    }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
    <title>UpdateProgress Tutorial</title>
    <style type="text/css">
    #UpdatePanel1 {
    200px; height:100px;
    border: 1px solid gray;
    }
    #UpdateProgress1 {
    200px; background-color: #FFC080;
    bottom: 0%; left: 0px; position: absolute;
    }
    </style>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <script language="javascript" type="text/javascript">
    <!--
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    function CancelAsyncPostBack() {
    if (prm.get_isInAsyncPostBack()) {
    prm.abortPostBack();
    }
    }
    prm.add_initializeRequest(InitializeRequest);
    prm.add_endRequest(EndRequest);
    var postBackElement;
    function InitializeRequest(sender, args) {
    if (prm.get_isInAsyncPostBack()) {
    args.set_cancel(true);
    }
    postBackElement = args.get_postBackElement();
    if (postBackElement.id == 'Panel1Trigger') {
    $get('UpdateProgress1').style.display = 'block';
    }
    }
    function EndRequest(sender, args) {
    if (postBackElement.id == 'Panel1Trigger') {
    $get('UpdateProgress1').style.display = 'none';
    }
    }
    // -->
    </script>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
    <asp:Label ID="Label1" runat="server" Text="Panel rendered."></asp:Label><br />
    <asp:Button ID="Button1" runat="server" Text="refresh" OnClick="Button1_Click" />
    </ContentTemplate>
    <Triggers>
    <asp:AsyncPostBackTrigger ControlID="Panel1Trigger" />
    </Triggers>
    </asp:UpdatePanel>
    <asp:Button ID="Panel1Trigger" runat="server" Text="Trigger" OnClick="Panel1Trigger_Click" />
    <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
    <ProgressTemplate>
    Processing...
    <input id="Button2"
    type="button"
    value="cancel"
    onclick="CancelAsyncPostBack()" />
    </ProgressTemplate>
    </asp:UpdateProgress>

    </div>
    </form>
    </body>
    </html>
      回复引用
    #59楼 2008-12-30 16:37 boulder  
    第一个例子的源码。承kalin
    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
    System.Threading.Thread.Sleep(3000);
    Label1.Text = DateTime.Now.ToString();
    }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>UpdateProgress Tutorial</title>
    <style type="text/css">
    #UpdatePanel1 {
    200px; height:100px;
    border: 1px solid gray;
    }
    #UpdateProgress1 {
    200px; background-color: #FFC080;
    bottom: 0%; left: 0px; position: absolute;
    }
    </style>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <asp:ScriptManager ID="ScriptManager1" runat="server"/>
    <script language="javascript" type="text/javascript">
    <!--
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    function CancelAsyncPostBack() {
    if (prm.get_isInAsyncPostBack()) {
    prm.abortPostBack();
    }
    }
    // -->
    </script>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
    <asp:Label ID="Label1" runat="server" Text="Panel rendered."></asp:Label><br />
    <asp:Button ID="Button2" runat="server" OnClick="Button1_Click" Text="refresh" />
    </ContentTemplate>
    </asp:UpdatePanel>

    </div>
    <asp:UpdateProgress ID="UpdateProgress1" runat="server">
    <ProgressTemplate>
    Processing...
    <input id="Button2"
    type="button"
    value="cancel"
    onclick="CancelAsyncPostBack()" />
    </ProgressTemplate>
    </asp:UpdateProgress>
    </form>
    </body>
    </html>
    支持(0)反对(0)
      回复引用
    #60楼 2008-12-30 16:39 boulder  
      回复引用
    #61楼 2009-01-06 17:22 游客512[未注册用户]
    写得不错,能再深入点就更好了!
      回复引用
    #62楼[楼主] 2009-01-06 18:34 TerryLee  
    @游客512
    写的比较早了……
    支持(0)反对(0)
      回复引用
    #63楼 2009-02-17 11:37 小成小[未注册用户]
    你好,我看了你的这篇文章,感觉非常不错!在此先谢谢你的共享了;另外还有一个问题谢谢您帮我解答一下:
    是这样的,你的这篇文章里面用到了控件开发者提供的一些类,这些类你是在哪里查到的??还有很多讲控件的只讲了些基本的用法,有些想自己扩展都不行,我想问的是:你拿到一个陌生的控件,你会去怎么熟悉它???
      回复引用
    #64楼 2009-03-17 22:25 vistalin[未注册用户]
    好文章是要回复的!!
      回复引用
    #65楼 2009-05-15 15:33 vince6799[未注册用户]
    onclick="CancelAsyncPostBack()"换成OnClientClick="CancelAsyncPostBack()"
      回复引用
    #66楼 2009-05-17 23:28 Grart
    使用MasterPageFile的页面ID和设计的时候不一至,请问这问题有方法能解决吗?
      回复引用
    #67楼[楼主] 2009-05-18 11:12 TerryLee  
    @Grart
    可以使用ClientID属性。
    支持(0)反对(0)
      回复引用
    #68楼 2009-05-22 13:26 小狼狗  
    good
    支持(0)反对(0)
      回复引用
    #69楼 2009-07-10 12:03 xcstar[未注册用户]
    学习中...
      回复引用
    #70楼 2009-07-16 14:42 Aloner  
    更上一台阶,但是最后一个示例是什么意思?仅仅是让Panel1Trigger 实现与 UpdatePanel 里的 button 相同效果?

    Lee,虽然是译文,但你翻译的很棒。但是我更奢求能劳烦您,在示例前讲解下自己的想法,比如这个例子是为了实现了什么?
    Thanks
    支持(0)反对(0)
      回复引用
    #71楼 2009-07-16 14:45 Aloner  
    更上一台阶,但是最后一个示例是什么意思?仅仅是让Panel1Trigger 实现与 UpdatePanel 里的 button 相同效果?

    Lee,虽然是译文,但你翻译的很棒。但是我更奢求能劳烦您,在示例前讲解下自己的想法,比如这个例子是为了实现了什么?
    Thanks
    支持(0)反对(0)
      回复引用
    #72楼 2009-07-24 15:38 zhu13802[未注册用户]
    在panel外面多加几个Button,点击其它Button,UpdateProgress还是会显示啊...
      回复引用
    #73楼 2009-08-11 19:33 bluesky4485  
    引用zhu13802:在panel外面多加几个Button,点击其它Button,UpdateProgress还是会显示啊...

    是的,我也碰到这个问题了。
    怎么解决啊?
    支持(0)反对(0)
      回复引用
    #74楼 2009-10-17 10:15 zxmzp2004  
    有没有在asp.net mvc中运用的例子啊?不需要那些page_load的后台代码。实现的效果就是左边是树形的导航,在右边显示内容
    ?,我的邮箱zxmzp2004@yahoo.com.cn十分感谢
    支持(0)反对(0)
      回复引用
    #75楼 2010-12-01 21:55 manimanihou  
    第一个例子的源码。承kalin
    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
    System.Threading.Thread.Sleep(3000);
    Label1.Text = DateTime.Now.ToString();
    }
    </script>
    the north face outlet 96 north face denali 96 northface outlet

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>UpdateProgress Tutorial</title>
    <style type="text/css">
    #UpdatePanel1 {
    200px; height:100px;
    border: 1px solid gray;
    }

    支持(0)反对(0)
      回复引用
    #76楼 2011-07-25 10:59 只是找工的  
    Text属性为cancle 这个写错了!cancel
    支持(0)反对(0)
      回复引用
    #77楼 2011-07-25 10:59 只是找工的  
    Text属性为cancle 这个写错了!cancel
    支持(0)反对(0)
      回复引用
    #78楼 2011-12-27 11:46 秋之白桦  
    @哈哈[匿名]
    顶你!我的也是按照同样的方法解决的
    支持(0)反对(0)
      回复引用
    #79楼 2011-12-27 14:54 秋之白桦  
    @kalin
    多谢了!正好解决了我的问题
  • 相关阅读:
    英语八级之路
    ASP.NET MVC 简易在线书店
    MySql 笔记
    自定义函数标签(JSTL)
    自定义标签(JSTL)
    Xml读取异常--Invalid byte 1 of 1-byte UTF-8 sequence
    JSTL核心标签库
    JSTL简介
    修改Servlet模板
    获取GET/POST提交的数据,并处理中文问题
  • 原文地址:https://www.cnblogs.com/joean/p/4603499.html
Copyright © 2011-2022 走看看