更新:2007 年 11 月
任何包含 UpdatePanel 控件的 ASP.NET 页还需要 ScriptManager 控件。若要将 UpdatePanel 控件用于母版页,则可以将 ScriptManager 控件放置在母版页上。在此情况下,母版页将为每个内容页提供一个 ScriptManager 控件。如果不希望为个别内容页启用部分页更新,则可以为这些页禁用部分页更新。
也可以将 ScriptManager 控件放置在每个内容页上。如果只有一些内容页将包含 UpdatePanel 控件,则可能需要这样做。
先决条件
若要在您自己的开发环境中实现这些过程,您需要:
- Visual Web Developer 速成版或 Microsoft Visual Studio 2005。 
- 一个支持 AJAX 的 ASP.NET 网站。 
向内容页添加 UpdatePanel 控件
- 创建新母版页并切换到“设计”视图。 
- 在工具箱的**“AJAX Extensions”**选项卡中,双击 ScriptManager 控件以将其添加到页面中。确保将 ScriptManager 控件添加到 ContentPlaceHolder 控件外部。 
- 在 ContentPlaceHolder 控件外部,添加文本“母版页”。 
- 从工具箱的**“HTML”选项卡中,将“水平规则”**元素拖动到文本的后面。 .png) 
- 创建母版页的内容页。 - 在解决方案资源管理器中,右击项目的名称,然后单击**“添加新项”。在“添加新项”对话框中,选中“选择母版页”复选框,再单击“确定”**。 
- 在 Content 控件内部,键入文本“内容页”,再从工具箱添加 UpdatePanel 控件。 .png) 
- 在 UpdatePanel 控件内部添加 Calendar 控件。 .png) 
- 保存更改,然后按 Ctrl+F5 在浏览器中查看页面。 
- 单击日历上的下个月和上个月控件。 - 日历将发生更改而不刷新整个页面。当日历位于与母版页不关联的页上的 UpdatePanel 控件内部时,此行为正是所需的行为。 - 示例设置的样式可以更好地显示 UpdatePanel 控件表示的页面区域。 - <%@ Page Language="VB" MasterPageFile="MasterPage.master" Title="UpdatePanel in Master Pages" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> Content Page<br /> <asp:UpdatePanel id="UpdatePanel1" runat="server"> <contenttemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" runat="server"></asp:Calendar> </fieldset> </contenttemplate> </asp:UpdatePanel> </asp:Content>- <%@ Page Language="C#" MasterPageFile="MasterPage.master" Title="UpdatePanel in Master Pages" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> Content Page<br /> <asp:UpdatePanel id="UpdatePanel1" runat="server"> <contenttemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" runat="server"></asp:Calendar> </fieldset> </contenttemplate> </asp:UpdatePanel> </asp:Content>- <%@ Master Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" runat="server"> <div> Master Page<br /> <hr /> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> </html>- <%@ Master 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"> </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" runat="server"> <div> Master Page<br /> <hr /> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> </html>
从母版页刷新 UpdatePanel
在本部分教程中,您会将控件添加到母版页,这将导致异步回发,然后刷新内容页上的 UpdatePanel 控件。
为所有内容页启用部分页更新
- 在母版页中切换到“设计”视图。 
- 将文本和两个按钮添加到母版页上的 ScriptManager 控件后面。 
- 将其中一个按钮的 ID 设置为 DecrementButton,并将其 Text 值设置为“-”。将另一个按钮的 ID 设置为 IncrementButton,并将其 Text 值设置为“+”。 .png) - 这两个按钮将增加和减少内容页的日历上选定的日期。 
- 选择 +(加号)按钮,然后在“属性”窗口的工具栏中,单击“事件”按钮并在**“单击”**框中输入 MasterButton_Click。 .png) 
- 对 -(减号)按钮重复上述步骤。 
- 在控件外部双击页以创建 Page_Load 事件处理程序。 
- 在处理程序中添加以下代码以将这两个按钮注册为异步回发控件: - Protected Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) ScriptManager1.RegisterAsyncPostBackControl(DecrementButton) ScriptManager1.RegisterAsyncPostBackControl(IncrementButton) End Sub- protected void Page_Load(object sender, EventArgs e) { ScriptManager1.RegisterAsyncPostBackControl(DecrementButton); ScriptManager1.RegisterAsyncPostBackControl(IncrementButton); }
- 添加以下代码以创建名为 MasterButton_Click 的 Click 处理程序: - Protected Sub MasterButton_Click(ByVal Sender As Object, ByVal E As EventArgs) Select Case Sender.ID Case "IncrementButton" Me.Offset = Me.Offset + 1 Case "DecrementButton" Me.Offset = Me.Offset - 1 End Select Dim upl As UpdatePanel upl = ContentPlaceHolder1.FindControl("UpdatePanel1") upl.Update() Dim cal As Calendar cal = ContentPlaceHolder1.FindControl("Calendar1") Dim newDateTime As DateTime newDateTime = DateTime.Today.Add(New TimeSpan(Offset, 0, 0, 0)) cal.SelectedDate = newDateTime End Sub- protected void MasterButton_Click(object sender, EventArgs e) { switch (((Control)sender).ID) { case "IncrementButton": this.Offset = this.Offset + 1; break; case "DecrementButton": this.Offset = this.Offset - 1; break; } ((UpdatePanel)ContentPlaceHolder1.FindControl("UpdatePanel1")).Update(); Calendar cal = ((Calendar)ContentPlaceHolder1.FindControl("Calendar1")); DateTime newDateTime = DateTime.Today.Add(new TimeSpan(Offset, 0, 0, 0)); cal.SelectedDate = newDateTime; }
- 添加以下代码以在母版页中创建名为 Offset 的公共属性,用来跟踪当天日期和选定日期之间的差异。 - Public Property Offset() As Integer Get If ViewState("Offset") Is Nothing Then Return 0 Else : Return ViewState("Offset") End If End Get Set(ByVal value As Integer) ViewState("Offset") = value End Set End Property- public Int32 Offset { get { return (Int32)(ViewState["Offset"] ?? 0);} set { ViewState["Offset"] = value;} }
- 在内容页中,切换到“设计”视图,然后双击 Calendar 控件以便为 SelectionChanged 事件创建事件处理程序。 
- 将下列代码添加到 SelectionChanged 事件处理程序以在用户选择日期时设置 Offset 属性。 - Protected Sub Calendar1_SelectionChanged(ByVal Sender As Object, ByVal E As EventArgs) Dim selectedDate As DateTime selectedDate = Calendar1.SelectedDate Master.Offset = _ Calendar1.SelectedDate.Subtract(DateTime.Today).Days End Sub- protected void Calendar1_SelectionChanged(object sender, EventArgs e) { DateTime selectedDate = Calendar1.SelectedDate; Master.Offset = ((TimeSpan)Calendar1.SelectedDate.Subtract( DateTime.Today)).Days; }
- 切换到内容页,然后添加 Page_Load 事件处理程序,该处理程序将日历的选定日期设置为当前日期。 - Protected Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Dim newDateTime As DateTime newDateTime = DateTime.Today.Add(New TimeSpan(Master.Offset, 0, 0, 0)) Calendar1.SelectedDate = newDateTime End Sub- protected void Page_Load(object sender, EventArgs e) { DateTime newDateTime = DateTime.Today.Add(new TimeSpan(Master.Offset, 0, 0, 0)); Calendar1.SelectedDate = newDateTime; }
- 向页添加 @ MasterType 指令,以便可以引用母版页的 Offset 属性作为强类型属性。 - <%@ MasterType VirtualPath="MasterPage.master" %>- <%@ MasterType VirtualPath="MasterPage.master" %>
- 在内容页中,切换到“设计”视图并选择 UpdatePanel 控件。 
- 在“属性”窗口中,将 UpdatePanelUpdateMode 属性设置为 Conditional。 .png) 
- 保存更改,然后按 Ctrl+F5 在浏览器中查看页面。 
- 单击日历上的下个月和上个月控件。 - 日历将发生更改而不刷新整个页面。 
- 选择日历上的一个日期,然后单击母版页上的按钮以更改选定的日期。 - 将发生这些更改而不会刷新整个页面。 - 示例设置的样式可以更好地显示 UpdatePanel 控件表示的页面区域。 - <%@ Page Language="VB" MasterPageFile="MasterPage.master" Title="UpdatePanel in Master Pages" %> <%@ MasterType VirtualPath="MasterPage.master" %> <script runat="server"> Protected Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) Dim newDateTime As DateTime newDateTime = DateTime.Today.Add(New TimeSpan(Master.Offset, 0, 0, 0)) Calendar1.SelectedDate = newDateTime End Sub Protected Sub Calendar1_SelectionChanged(ByVal Sender As Object, ByVal E As EventArgs) Dim selectedDate As DateTime selectedDate = Calendar1.SelectedDate Master.Offset = _ Calendar1.SelectedDate.Subtract(DateTime.Today).Days End Sub </script> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> Content Page<br /> <asp:UpdatePanel id="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged"></asp:Calendar> </fieldset> </ContentTemplate> </asp:UpdatePanel> </asp:Content>- <%@ Page Language="C#" MasterPageFile="MasterPage.master" Title="UpdatePanel in Master Pages" %> <%@ MasterType VirtualPath="MasterPage.master" %> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { DateTime newDateTime = DateTime.Today.Add(new TimeSpan(Master.Offset, 0, 0, 0)); Calendar1.SelectedDate = newDateTime; } protected void Calendar1_SelectionChanged(object sender, EventArgs e) { DateTime selectedDate = Calendar1.SelectedDate; Master.Offset = ((TimeSpan)Calendar1.SelectedDate.Subtract( DateTime.Today)).Days; } </script> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> Content Page<br /> <asp:UpdatePanel id="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged"></asp:Calendar> </fieldset> </ContentTemplate> </asp:UpdatePanel> </asp:Content>- <%@ Master Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Public Property Offset() As Integer Get If ViewState("Offset") Is Nothing Then Return 0 Else : Return ViewState("Offset") End If End Get Set(ByVal value As Integer) ViewState("Offset") = value End Set End Property Protected Sub MasterButton_Click(ByVal Sender As Object, ByVal E As EventArgs) Select Case Sender.ID Case "IncrementButton" Me.Offset = Me.Offset + 1 Case "DecrementButton" Me.Offset = Me.Offset - 1 End Select Dim upl As UpdatePanel upl = ContentPlaceHolder1.FindControl("UpdatePanel1") upl.Update() Dim cal As Calendar cal = ContentPlaceHolder1.FindControl("Calendar1") Dim newDateTime As DateTime newDateTime = DateTime.Today.Add(New TimeSpan(Offset, 0, 0, 0)) cal.SelectedDate = newDateTime End Sub Protected Sub Page_Load(ByVal Sender As Object, ByVal E As EventArgs) ScriptManager1.RegisterAsyncPostBackControl(DecrementButton) ScriptManager1.RegisterAsyncPostBackControl(IncrementButton) End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" runat="server"> <div> Master Page<br /> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> Change date   <asp:Button ID="DecrementButton" runat="server" Text="-" OnClick="MasterButton_Click" /> <asp:Button ID="IncrementButton" runat="server" Text="+" OnClick="MasterButton_Click" /> <hr /> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> </html>- <%@ Master 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"> public Int32 Offset { get { return (Int32)(ViewState["Offset"] ?? 0);} set { ViewState["Offset"] = value;} } protected void MasterButton_Click(object sender, EventArgs e) { switch (((Control)sender).ID) { case "IncrementButton": this.Offset = this.Offset + 1; break; case "DecrementButton": this.Offset = this.Offset - 1; break; } ((UpdatePanel)ContentPlaceHolder1.FindControl("UpdatePanel1")).Update(); Calendar cal = ((Calendar)ContentPlaceHolder1.FindControl("Calendar1")); DateTime newDateTime = DateTime.Today.Add(new TimeSpan(Offset, 0, 0, 0)); cal.SelectedDate = newDateTime; } protected void Page_Load(object sender, EventArgs e) { ScriptManager1.RegisterAsyncPostBackControl(DecrementButton); ScriptManager1.RegisterAsyncPostBackControl(IncrementButton); } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" runat="server"> <div> Master Page<br /> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> Change date   <asp:Button ID="DecrementButton" runat="server" Text="-" OnClick="MasterButton_Click" /> <asp:Button ID="IncrementButton" runat="server" Text="+" OnClick="MasterButton_Click" /> <hr /> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> </html>
为内容页禁用部分页更新
如果向母版页添加 ScriptManager 控件,则默认情况下将为所有内容页启用部分页更新。如果不希望为个别内容页启用部分页更新,则可以禁用此功能。如果内容页包含与部分页更新不兼容的自定义控件,则可能需要这样做。
为内容页禁用部分页更新
- 在内容页中,为页的 Init 事件创建一个处理程序,该处理程序将 ScriptManager 控件的 EnablePartialRendering 属性设置为 false。 - 在内容页的 Init 事件期间或之前,必须更改 EnablePartialRendering 属性的状态。 
回顾
本教程演示如何在母版页中使用 UpdatePanel 控件。如果母版页中存在 ScriptManager 控件,则可以在内容页中使用 UpdatePanel 控件,而无需在内容页中声明 ScriptManager 控件。
若要为单个内容页(其母版页已启用部分页呈现)禁用部分页呈现,请以编程方式为内容页禁用部分页呈现。
请参见
任务
创建具有多个 UpdatePanel 控件的简单 ASP.NET 页
概念
将 ASP.NET UpdatePanel 控件与数据绑定控件一起使用