zoukankan      html  css  js  c++  java
  • ScriptManager 和UpdatePannel

    ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,
    因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功能。
      
    几个重要的属性:   
    ScriptManager控件的EnablePartialRendering属性:true-实现页面的异步局部更新;false-实现全页面的刷新。   
    UpdatePanel控件的RenderMode属性:InLine-UpdatePanel控件被解析成HTML的<span>标记;Block-UpdatePanel控件被解析成HTML控件的<DIV>。   
    UpdatePanel控件的UpdateMode属性:Always-UpdatePanel页面上任何一处发生的回发操作都会产生页局部更新;Conditional-只在特定的情况下才产页面的回发,
    如执行UpdatePanel控件的update()方法或在指定的触发器的操作下。   
    UpdatePanel控件的ChildAsTrigger属性:指示UpdatePanel内部控件引起的回发是否产生当前UpdatePanel控件的局部更新。如果UpdateMode设为Always的话,
    那ChildAsTrigger局性必须设为True,否则运行出错。
      
    一、UpdatePanel内部的控件引起的回发,来更新当前UpdatePanel内部的控件内容:   
    1.向页面中加入ScriptManager、UpdatePanel控件和一个Label控件(Label2)。   
    2.在UpdatePanel中加入一个Button、一个Label(Label1)。   
    3.双击Button在事件处理程序中写入下列代码:Label1.Text = DateTime.Now.ToString();   
    4.在Page_Load事件中写入下列代码:Label2.Text = DateTime.Now.ToString();   
    5.运行页面,发现每次点击按钮都会产生异步局步刷新,只有Label1的内容发生更改,页面上的Label2时间没有发生更改。
       代码如下:   
    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>   
    <asp:ScriptManager ID="ScriptManager1" runat="server">   </asp:ScriptManager>   
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="True">   
    <ContentTemplate>   
    <asp:Label ID="Label1" runat="server"></asp:Label>   <br />   
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />   
    </ContentTemplate>   
    </asp:UpdatePanel>


       protected void Button1_Click(object sender, EventArgs e)   
    {   Label1.Text = DateTime.Now.ToString(); ;   }   
    protected void Page_Load(object sender, EventArgs e)   
    {   Label2.Text = DateTime.Now.ToString();   }   
    注意:此时的ScriptManager的EnablePartialRendering属性应设为true。UpdatePanel的UpdateMode属性应设为Always。ChildAsTrigger属性应设为true。

      二、UpdatePanel控件外部的控件引起的回发,来异步更新UpdatePanel内部的内容:   
    虽然上面的方式能够很简单地实现异步局部更新的功能,但就性能方面考虑,我们应当只将数据确实会发生变化的控件摆放在UpdatePanel中,
    这就可能会出现引起回发的控件不在UpdatePanel内的情况。   

    有两种方式实现这种效果:   
    a.在Page_Load方法中用ScriptManager1.RegisterAsyncPostBackControl()来注册一下要实现异步更新的控件。  
    b.用触发器来实现。

       1、ScriptManager1.RegisterAsyncPostBackControl()注册的控件可以实现对所有的UpdatePanel控件的异步更新。   
    如:ScriptManager1.RegisterAsyncPostBackControl(this.Button2);实现对Button2的注册,那此时Button2的回发就变成一个异步回发(页面不会刷新),
    它会导致页面上所有的UpdatePanel的内容的更新。   
    注意:此时的ScriptManager的EnablePartialRendering属性应设为true。UpdatePanel的UpdateMode属性应设为Always。  
    2、ScriptManager1.RegisterAsyncPostBackControl()注册的控件可以实现针对特定UpdatePanel控件的异步更新。   
    a.把页面上所有的UpdatePanel控件的UpdateMode设为Conditional。   
    b.ScriptManager1.RegisterAsyncPostBackControl(this.Button2);实现对Button2的注册。   
    c.在Button2控件的Click事件中后面加入后面的代码:UpdatePanel1.Update();   这样Button2按钮只对UpdatePanel1控件实现的异步的局部刷新。   
    注意:这里的UpdatePanel的属性要设为Conditional,如果还是Always的话,会出现所有的UpdatePanel都刷新的效果。   
    3、触发器   
    如果页面上有多个UpdatePanel控件,如果要实现外部的控件的回发引发指定UpdatePanel的更新的话,那应当为要实现刷新的UpdatePanel控件建立一个触发器。   
    a.选中要进行局部更新的UpdatePanel控件。   
    b.在其属性页中点击Triggers集合属性右边的小按钮。   
    c.在弹出的对话框中,的成员列表中添加一个AsyncPostBackTriggers成员。   
    d.指定AsyncPostBackTriggers成员的ControlID和EventName,即引发异步回送的控件的ID和该控件的事件。   
    完成以上步骤后,切换到HTML页面就会出现下列代码:  
     <asp:UpdatePanel ID="UpdatePanel2" runat="server" RenderMode="Inline" UpdateMode="Conditional">   
    <ContentTemplate>   
    <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>   
    </ContentTemplate>   
    <Triggers>   
    <asp:AsyncPostBackTrigger ControlID="Button2" EventName="Click" />   
    </Triggers>   
    </asp:UpdatePanel>   
    <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="ButtonOut" />   
    这里需要大家注意的是:   把所有的UpdatePanel控件的UpdateMode设为"Conditional",这样才能够针对建有相关触发器的UpdatePanel更新。   
    一个UpdatePanel上可以建有多个触发器,实现在不同的情况下对该UpdatePanel控件内容的更新。
      三、两个UpdatePanel控件,其中一个UpdatePanel内的控件引发两个UpdatePanel控件的同时刷新。   
    a.在页面上放入两个UpdatePanel和一个ScriptManager控件。   
    b.在UpdatePanel1中加入一个标签Label1、一个按钮Button1 ,在UpdatePanel2中加入一个标签Label2。   
    c.将UpdatePanel1和UpdatePanel2两个控件的的UpdateMode属性设为"Always"   
    c.在Button1的Click事件中加入下面的代码:   
    protected void Button1_Click(object sender, EventArgs e)   
    {   Label1.Text = DateTime.Now.ToString();   Label2.Text = DateTime.Now.ToString();   }
      四、两个UpdatePanel控件,其中一个UpdatePanel内的控件引发当前的UpdatePanel控件的刷新,而另一个不刷新。   
    a.步骤和上面的(三)一样  
      b.要把UpdatePanel1和UpdatePanel2两个控件的UpdateMode属性设为Conditional   
    <asp:ScriptManager ID="ScriptManager1" runat="server">   </asp:ScriptManager>   
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">   
    <ContentTemplate>   
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>   <br />   
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click1" Text="更新两个UpdatePanel" />   
    </ContentTemplate>   
    </asp:UpdatePanel>   
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">   
    <ContentTemplate>   
    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>   
    </ContentTemplate>   
    </asp:UpdatePanel>   
    五、两个UpdatePanel控件,其中一个UpdatePanel内的控件引发另一个UpdatePanel控件的刷新,而本身不刷新。   
    a.步骤和上面的(四)一样   
    b.把UpdatePanel1和UpdatePanel2的ChildrenAsTriggers属性设为false   
    c.在UpdatePanel2控件中加入一个触发器,触发源设到UpdatePanel1控件内的Button1的Click事件上。  
      <asp:ScriptManager ID="ScriptManager1" runat="server">   </asp:ScriptManager>   
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">   
    <ContentTemplate>   
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>   <br />   
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click1" Text="更新两个UpdatePanel" />   
    </ContentTemplate>   
    </asp:UpdatePanel>   
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">   
    <ContentTemplate>   
    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>   
    </ContentTemplate>   
    <Triggers>   
    <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />   
    </Triggers>   
    </asp:UpdatePanel>

    额外总结:

    2.ScriptManager

       2.1一个.aspx页面只允许存在1个ScriptManager控件

       2.2属性

      EnablePartialRendering :true页面局部刷新/false页面整体刷新

    3.UpdatePanel

       3.1一个页面可以存在多个UpdatePanel控件,可以嵌套

       3.2属性

           RenderMode : InLine-UpdatePanel 控件被解析为HTML的<SPAN>

                                  Block-UpdatePanel   控件被解析为HTML的<DIV>

           UpdateMode :Always-UpdatePanel 页面任何一处发生回调都产生页面局部更新

                Conditional 只在特定的情况下产生页面回调用,如执行UpdatePanel控件的update()方法

         ChildAsTrigger :指示UpdatePanel内部控件引发的回调是否产生当前UpdatePanel控件局部更新

                 UpdateMode="Always"则ChildAsTrigger必须="True" 

    4.UpdatePanel应用的几种情况

     4.1 由UpdatePanel外部的控件引起的回调,更新UpdatePanel内部控件,需要进行注册

    方法1 ScriptManager1.RegisterAsyncPostBackControl()注册的控件

    方法2 ScriptManager1.RegisterAsyncPostBackControl()注册的控件

    发法3 触发器

       4.2 两个UpdatePanel控件,其中一个UpdatePanel内的控件引发两个UpdatePanel控件的同时刷新。

       4.3 两个UpdatePanel控件,其中一个UpdatePanel内的控件引发当前的UpdatePanel控件的刷新,而另一个不刷新。

       4.4 两个UpdatePanel控件,其中一个UpdatePanel内的控件引发另一个UpdatePanel控件的刷新,而本身不刷新。

    5.母板页中添加UpdatePanel ,在母板页中添加了ScriptManager则在aspx页面中不再需要添加ScriptMager

  • 相关阅读:
    idea 开发中常用的36个快捷键!
    算法学习一
    elastic-job-lite使用文档
    Windows使用Fiddler对手机抓包或调试本地计算机web站点方法
    Thread.join的作用和原理
    static修饰的代码块被称作静态代码块
    【Java面试题】52 java中会存在内存泄漏吗,请简单描述。
    数据类型 Object.keys,values,entries
    数据类型 Map and Set(映射和集合)
    数组映射到对象
  • 原文地址:https://www.cnblogs.com/xiaohui1990/p/3430392.html
Copyright © 2011-2022 走看看