• ASP.Net UpdatePanel控件(转)


      Asp.net UpdatePanel 允许用户构建一个丰富的,以客户端为中心的应用程序,引用UpdatePanel控件,能够实现页面的部分刷新,一个包含scriptManage和 UpdatePanel控件的页面自动具有页面部分刷新的功能,不需要写任何的客户端JavaScript代码。一个web页面只能包含一个 ScriptManage控件,但可以包含一个或多个UpdatePanel控件。

      使用UpdatePanel控件实现页面的局部更新,需要包含一个ScriptManage控件,并且必须将ScriptManage控件的 EnablePartialRendering属性设置为true,不过你不用担心,该属性的默认值就是True,所以,在默认情况下,只要添加了 ScriptManage控件,该页面就自动具有了局部更新的能力。

      下面,我们来看看页面中UpdatePanel的几种用法:

      一、一般用法:下面的代码展示了一个包含了一个Button控件的UpdatePanel控件的一般用法,因为UpdatePanel控件的ChildAsTriggers属性默认值为ture,所以,当我们点击这个Button按钮时将引发一个异步回传。

     1 <div>
     2             <asp:ScriptManager ID="ScriptManager" 
     3                                runat="server" />
     4             <asp:UpdatePanel ID="UpdatePanel1" 
     5                              UpdateMode="Conditional"
     6                              runat="server">
     7                 <ContentTemplate>
     8                    <fieldset>
     9                    <legend>UpdatePanel content</legend>
    10                     <!-- Other content in the panel. -->
    11                     <%=DateTime.Now.ToString() %>
    12                     <br />
    13                     <asp:Button ID="Button1" 
    14                                 Text="Refresh Panel" 
    15                                 runat="server" />
    16                     </fieldset>
    17                 </ContentTemplate>
    18             </asp:UpdatePanel>
    19         </div>
    20 

      二、为UpdatePanel控件指定一个Trigger:默认情况下,UpdatePanel控件内部的任何控件引发的PostBack都是异步 PostBack,同时实现页面的局部更新,当然,你也可以去配置一个其他的控件去刷新一个UpdatePanel,这时,你需要设置 UpdatePanel的Trigger属性,一个Trigger将被绑定到指定的控件,当这个控件引发postback时,将异步刷新这个 UpdatePanel,当然,这个被Trigger指定的控件不必在该UpdatePanel内。请看如下代码:

     1 <div>
     2     <asp:Button ID="Button1" 
     3                 Text="Refresh Panel"
     4                 runat="server" />
     5     <asp:ScriptManager ID="ScriptManager1" 
     6                        runat="server" />
     7     <asp:UpdatePanel ID="UpdatePanel1" 
     8                      UpdateMode="Conditional"
     9                      runat="server">
    10                      <Triggers>
    11                        <asp:AsyncPostBackTrigger ControlID="Button1" />
    12                      </Triggers>
    13                      <ContentTemplate>
    14                      <fieldset>
    15                      <legend>UpdatePanel content</legend>
    16                      <%=DateTime.Now.ToString() %>
    17                      </fieldset>
    18                      </ContentTemplate>
    19     </asp:UpdatePanel>
    20 
    21     </div>
    22 

      在UpdatePanel的Trigger元素里,我们定义了一个<asp:AsyncPostBackTrigger> 元素,该元素的ControlID 属性指定了引发Trigger的控件ID,EventName属性指定了引发PostBack的事件名称,若未指定该属性,将使用该控件的默认事件(例如:在Button控件中,默认事件为Click事件)。另,以上设置都可以在VS2005属性设计器中可视化的设置。

      三、Master Page中的UpdatePanel:在Master Page中使用UpdatePanel,你必须决定如何包含ScriptManage控件,有以下两种策略在页面上来包含ScriptManger控件,1.将ScriptManage控件放置在Masert Page中,这样,它将作用于所有内容页。如果你想在内容页去注册脚本货服务,你可以在内容页添加一个ScriptManagerProxy 控件。2.将ScriptManage控件放置在每个包含UpdatePanel的内容页上。使用何种策略,取决于你将在你的应用程序中以何种方式管理你的脚本。

      如果以策略一的方式包含了ScriptManage控件,但你在某个内容页面上又不想实现局部更新,那么,你就必须在该页面以编程的方式设置ScriptManage控件的 EnablePartialRendering 属性为false。下面代码展示了以策略一的方式使用UpdatePanel的情况:
    Master Page:
     1 <%@ Master Language="C#" %>
     2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     3  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4 
     5 <script runat="server">
     6 
     7     public DateTime LastUpdate
     8     {
     9         get
    10         {
    11             return (DateTime)(ViewState["LastUpdate"?? DateTime.Now);
    12         }
    13         set
    14         {
    15             ViewState["LastUpdate"= value;
    16         }
    17     }
    18 
    19 
    20     protected void MasterButton2_Click(object sender, EventArgs e)
    21     {
    22         LastUpdate = DateTime.Now;
    23         ((UpdatePanel)ContentPlaceHolder1.FindControl("UpdatePanel1")).Update();
    24 
    25     }
    26 
    27     protected void Page_Load(object sender, EventArgs e)
    28     {
    29         ScriptManager1.RegisterAsyncPostBackControl(Button2);
    30     }
    31 </script>
    32 
    33 <html xmlns="http://www.w3.org/1999/xhtml">
    34 <head id="Head1" runat="server">
    35     <title>ScriptManager in Master Page Example</title>
    36 </head>
    37 <body>
    38     <form id="form1" runat="server">
    39         <div>
    40             <asp:ScriptManager ID="ScriptManager1" runat="server" />
    41             <asp:Panel ID="MasterPanel1" runat="server" GroupingText="Master Page">
    42                <asp:Button ID="Button1" runat="server" Text="Full Page Refresh" />
    43                <asp:Button ID="Button2" runat="server" Text="Refresh Panel" OnClick="MasterButton2_Click" />
    44             </asp:Panel>
    45             <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
    46             </asp:ContentPlaceHolder>
    47         </div>
    48     </form>
    49 </body>
    50 </html>
    51 
    Content Page:
     1 <%@ Page Language="C#" MasterPageFile="MasterCS.master"
     2     Title="ScriptManager in Content Page" %>
     3 
     4 <%@ MasterType VirtualPath="MasterCS.master" %>
     5 
     6 <script runat="server">
     7 
     8     protected void Button3_Click(object sender, EventArgs e)
     9     {
    10         Master.LastUpdate = DateTime.Now;
    11     }
    12 
    13 </script>
    14 
    15 <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1"
    16     runat="Server">
    17     <asp:Panel ID="Panel2"
    18                GroupingText="ContentPage"
    19                runat="server" >
    20         <asp:UpdatePanel ID="UpdatePanel1" 
    21                          UpdateMode="Conditional" 
    22                          runat="server">
    23             <ContentTemplate>
    24                 <p>
    25                     Last updated: <strong>
    26                         <%= Master.LastUpdate.ToString() %>
    27                     </strong>
    28                 </p>
    29                 <asp:Button ID="Button3"
    30                             Text="Refresh Panel"
    31                             OnClick="Button3_Click"
    32                             runat="server"  />
    33             </ContentTemplate>
    34         </asp:UpdatePanel>
    35     </asp:Panel>
    36 </asp:Content>

      四、UpdatePanel的嵌套:UpdatePanel能够嵌套使用,在这种情况下,若父Panel被刷新,那么,所有的子Panel也将被刷新。请看如下代码:
     1  <div>
     2             <asp:ScriptManager ID="ScriptManager" 
     3                                runat="server" />
     4             <asp:UpdatePanel ID="OuterPanel" 
     5                              UpdateMode="Conditional" 
     6                              runat="server">
     7                 <ContentTemplate>
     8                     <div>
     9                         <fieldset>
    10                             <legend>Outer Panel </legend>
    11                             <br />
    12                             <asp:Button ID="OPButton1" 
    13                                         Text="Outer Panel Button" 
    14                                         runat="server" />
    15                             <br />
    16                             Last updated on
    17                             <%= DateTime.Now.ToString() %>
    18                             <br />
    19                             <br />
    20                             <asp:UpdatePanel ID="NestedPanel1" 
    21                                                UpdateMode="Conditional"
    22                                                runat="server">
    23                                 <ContentTemplate>
    24                                     <div class="NestedPanel">
    25                                         <fieldset>
    26                                             <legend>Nested Panel 1</legend>
    27                                             <br />
    28                                             Last updated on
    29                                             <%= DateTime.Now.ToString() %>
    30                                             <br />
    31                                             <asp:Button ID="NPButton1"
    32                                                         Text="Nested Panel 1 Button" 
    33                                                         runat="server" />
    34                                         </fieldset>
    35                                     </div>
    36                                 </ContentTemplate>
    37                             </asp:UpdatePanel>
    38                         </fieldset>
    39                     </div>
    40                 </ContentTemplate>
    41             </asp:UpdatePanel>
    42  </div>
    43 

      五:以编程方式刷新UpdatePanel:
      1 <%@ Page Language="C#" %>
      2 
      3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      5 
      6 <script runat="server">
      7 
      8     protected SortedList AnsweredQuestions
      9     {
     10         get { return (SortedList)(ViewState["AnsweredQuestions"?? new SortedList()); }
     11         set { ViewState["AnsweredQuestions"= value; }
     12     }
     13 
     14     protected void Page_Load()
     15     {
     16         ScriptManager1.RegisterAsyncPostBackControl(SurveyDataList);
     17     }
     18 
     19     protected void ChoicesRadioButtonList_SelectedIndexChanged(object sender, EventArgs e)
     20     {
     21         SortedList answers = this.AnsweredQuestions;
     22         RadioButtonList r = (RadioButtonList)sender;
     23         answers[r.ToolTip] = r.SelectedValue;
     24         this.AnsweredQuestions = answers;
     25 
     26         ResultsList.DataSource = this.AnsweredQuestions;
     27         ResultsList.DataBind();
     28 
     29         if (this.AnsweredQuestions.Count == SurveyDataList.Items.Count)
     30             SubmitButton.Visible = true;
     31 
     32         UpdatePanel1.Update();
     33     }
     34 
     35     protected void SubmitButton_Click(object sender, EventArgs e)
     36     {
     37         // Submit responses.
     38     }
     39 </script>
     40 
     41 <html xmlns="http://www.w3.org/1999/xhtml">
     42 <head id="Head1" runat="server">
     43     <title>Registering Controls as Async Postback Controls</title>
     44     <style type="text/css">
     45     .AnswerFloatPanelStyle {
     46     background-color: bisque;
     47     position: absolute;
     48     right: 10px;
     49     height: 130px;
     50     width: 150px;
     51     border-right: silver thin solid; border-top: silver thin solid; 
     52     border-left: silver thin solid; border-bottom: silver thin solid;    
     53     }
     54     </style>
     55 </head>
     56 <body>
     57     <form id="form1" runat="server">
     58         <div>
     59             <asp:ScriptManager ID="ScriptManager1" runat="server" />
     60             <div id="AnswerFloatPanel" class="AnswerFloatPanelStyle" runat="server">
     61                 <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
     62                     <ContentTemplate>
     63                         Completed Questions:
     64                         <asp:DataList ID="ResultsList" runat="server">
     65                             <ItemTemplate>
     66                                 <asp:Label ID="ResultQuestion" runat="server" Text='<%# Eval("Key") %>' />
     67                                 ::
     68                                 <asp:Label ID="ResultAnswer" runat="server" Text='<%# Eval("Value") %>' />
     69                             </ItemTemplate>
     70                         </asp:DataList>
     71                         <style="text-align: right">
     72                             <asp:Button ID="SubmitButton" Text="Submit" runat="server" Visible="false"
     73                                 OnClick="SubmitButton_Click" />
     74                         </p>
     75                         <asp:Label ID="Message" runat="Server" />
     76                     </ContentTemplate>
     77                 </asp:UpdatePanel>
     78             </div>
     79             
     80             <asp:XmlDataSource ID="SurveyDataSource" 
     81                                runat="server" 
     82                                XPath="/Questions/Question"
     83                                DataFile="~/App_Data/SurveyQuestions.xml"/>
     84             <asp:DataList
     85                 ID="SurveyDataList"
     86                 DataSourceID="SurveyDataSource"
     87                 runat="server">
     88 
     89                 <ItemTemplate>
     90                   <table cellpadding="2" cellspacing="2">
     91                     <tr>
     92                       <td valign="top">
     93                         <asp:Label id="QuestionLabel" Text='<%# XPath("@Title")%>' runat="server" />
     94                       </td>
     95                     </tr>
     96                     <tr><td>
     97                       <asp:RadioButtonList ID="ChoicesRadioButtonList" runat="server" 
     98                         DataSource='<%#XPathSelect("Choices/Choice") %>'
     99                         DataTextField="InnerText" DataValueField="InnerText" 
    100                         AutoPostBack="True"
    101                         ToolTip='<%"Question" + XPath("@ID"%>'
    102                         OnSelectedIndexChanged="ChoicesRadioButtonList_SelectedIndexChanged"/>
    103                     </td></tr>
    104                   </table>
    105                   <hr />
    106                 </ItemTemplate>
    107             </asp:DataList>
    108         </div>
    109     </form>
    110 </body>
    111 </html>
    112 
      在以上代码中,页面调用ScriptManager1.RegisterAsyncPostBackControl(SurveyDataList); 方法注册了一个能够引发Trigger的控件,调用Update()方法实现了Updatepanel的刷新。

      六:以编程方式创建UpdatePanel:你能够以编程的方式创建一个UpdatePanel的实例,并且可以使用它的ContentTemplateContainer 属性和Add(control)方法为该Panel添加内容,请看如下代码。
     1 <%@ Page Language="C#" %>
     2 
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     4  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     5 
     6 <script runat="server">
     7 
     8     protected void Page_Load(object sender, EventArgs e)
     9     {
    10         UpdatePanel up1 = new UpdatePanel();
    11         up1.ID = "UpdatePanel1";
    12         up1.UpdateMode = UpdatePanelUpdateMode.Conditional;
    13         Button button1 = new Button();
    14         button1.ID = "Button1";
    15         button1.Text = "Submit";
    16         button1.Click += new EventHandler(Button_Click);
    17         Label label1 = new Label();
    18         label1.ID = "Label1";
    19         label1.Text = "A full page postback occurred.";
    20         up1.ContentTemplateContainer.Controls.Add(button1);
    21         up1.ContentTemplateContainer.Controls.Add(label1);
    22         Page.Form.Controls.Add(up1);
    23 
    24     }
    25     protected void Button_Click(object sender, EventArgs e)
    26     {
    27         ((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +
    28             DateTime.Now.ToString();
    29     }
    30 
    31 </script>
    32 
    33 <html xmlns="http://www.w3.org/1999/xhtml">
    34 <head id="Head1" runat="server">
    35     <title>UpdatePanel Added Programmatically Example</title>
    36 </head>
    37 <body>
    38     <form id="form1" runat="server">
    39         <div>
    40             <asp:ScriptManager ID="TheScriptManager"
    41                                runat="server" />
    42         </div>
    43     </form>
    44 </body>
    45 </html>
    46 
      由于UpdatePanel的ChildrenAsTriggers的默认属性为True,所以,在该示例中,Button控件将引发Panel的Trigger。

      参考文档:http://ajax.asp.net/docs/overview/UpdatePanelOverview.aspx

      以上文档是我对asp.net ajax一个官方文档的....,不能说翻译吧,毕竟,我的E文水平是要借助金山词霸才能看懂的,算是自我的一个理解吧,也正因为我E文水平有限,很多疏漏,错误,和理解不正确的地方,还请大家不吝指出哈,我也是一个Ajax新手,非常希望得到你的指点。




  • 相关阅读:
    数据库基础
    (转)数据流图
    (转)SQL执行顺序
    (转)数据库隔离级别及实现原理
    (转)求单链表是否有环,环入口和环长
    (转)最长公共子序列
    (转)Java锁、自旋锁、CAS机制
    Java线程状态转换
    OpenSUSE 13.2安装Texlive2014+Texmaker+Lyx
    GIMP也疯狂之动态图的制作(四)
  • 原文地址:https://www.cnblogs.com/qixuejia/p/3761684.html
Copyright © 2020-2023  润新知