Verwenden des ASP.NET-UpdatePanel-Steuerelements mit Masterseiten
Aktualisiert: November 2007
Für jede ASP.NET-Seite, die ein UpdatePanel-Steuerelement enthält, ist zusätzlich ein ScriptManager-Steuerelement erforderlich. Um UpdatePanel-Steuerelemente mit Masterseiten zu verwenden, können Sie auf der Masterseite ein ScriptManager-Steuerelement hinzufügen. Die Masterseite in diesem Szenario stellt ein ScriptManager-Steuerelement für jede Inhaltsseite bereit. Wenn Teilaktualisierungen von Seiten für einzelne Inhaltsseiten nicht ausgeführt werden sollen, können Sie die Teilaktualisierungen von Seiten für diese Seiten deaktivieren.
Wahlweise können Sie auf jeder Inhaltsseite das ScriptManager-Steuerelement einfügen. Dies empfiehlt sich, wenn nur einige der Inhaltsseiten UpdatePanel-Steuerelemente enthalten sollen.
Vorbereitungsmaßnahmen
Zur Implementierung dieser Prozeduren in Ihrer eigenen Entwicklungsumgebung ist Folgendes erforderlich:
Visual Web Developer Express Edition oder Microsoft Visual Studio 2005.
Eine AJAX-fähige ASP.NET-Website.
So fügen Sie einer Inhaltsseite ein UpdatePanel-Steuerelement hinzu
Erstellen Sie eine neue Masterseite, und wechseln Sie in die Entwurfsansicht.
Doppelklicken Sie auf der Registerkarte AJAX-Erweiterungen der Toolbox auf das ScriptManager-Steuerelement, um es der Seite hinzuzufügen. Stellen Sie sicher, dass Sie das ScriptManager-Steuerelement außerhalb des ContentPlaceHolder-Steuerelements hinzufügen.
Fügen Sie außerhalb des ContentPlaceHolder-Steuerelements den Text Masterseite hinzu.
Ziehen Sie von der Registerkarte HTML der Toolbox ein Horizontale Trennlinie-Element unter den Text.
Erstellen einer Inhaltsseite für die Masterseite
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und klicken Sie anschließend auf Neues Element hinzufügen. Aktivieren Sie im Dialogfeld Neues Element hinzufügen das Kontrollkästchen Masterseite auswählen, und klicken Sie anschließend auf OK.
Geben Sie im Content-Steuerelement den Text Inhaltsseite ein, und fügen Sie anschließend aus der Toolbox ein UpdatePanel-Steuerelement hinzu.
Fügen Sie ein Calendar-Steuerelement in das UpdatePanel-Steuerelement ein.
Speichern Sie die Änderungen. Drücken Sie anschließend STRG+F5, um die Seite in einem Browser anzuzeigen.
Klicken Sie im Kalender auf die Steuerelemente für den vorherigen bzw. nächsten Monat.
Der Kalender wird geändert, ohne dass die gesamte Seite aktualisiert wird. Dies entspricht dem zu erwartenden Verhalten, wenn sich der Kalender im UpdatePanel-Steuerelement auf einer Seite befindet, die nicht mit einer Masterseite verknüpft ist.
Das Beispiel ist so formatiert, dass der Bereich der Seite, der das UpdatePanel-Steuerelement darstellt, deutlicher angezeigt wird.
<%@ 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" > <contenttemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" ></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" > <contenttemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" ></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 > </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" > <div> Master Page<br /> <hr /> <asp:ScriptManager ID="ScriptManager1" > </asp:ScriptManager> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" > </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 > </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head > <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" > <div> Master Page<br /> <hr /> <asp:ScriptManager ID="ScriptManager1" > </asp:ScriptManager> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" > </asp:contentplaceholder> </div> </form> </body> </html>
Aktualisieren des UpdatePanel aus der Masterseite
In diesem Teil des Lernprogramms fügen Sie der Masterseite Steuerelemente hinzu, die ein asynchrones Postback auslösen und anschließend auf der Inhaltsseite das UpdatePanel-Steuerelement aktualisieren.
So aktivieren Sie Teilaktualisierungen von Seiten für alle Inhaltsseiten
Wechseln Sie auf der Masterseite in die Entwurfsansicht.
Fügen Sie auf der Masterseite nach dem ScriptManager-Steuerelement Text und zwei Schaltflächen hinzu.
Legen Sie die ID einer Schaltfläche auf DecrementButton und den Text-Wert dieser Schaltfläche auf "-" fest. Legen Sie die ID der anderen Schaltfläche auf IncrementButton und den Text-Wert dieser Schaltfläche auf "+" fest.
Mit diesen Schaltflächen wird das im Kalender ausgewählte Datum auf der Inhaltsseite inkrementiert und dekrementiert.
Wählen Sie die +-Schaltfläche (Pluszeichen) aus, und klicken Sie anschließend auf der Symbolleiste des Eigenschaftenfensters auf die Schaltfläche für Ereignisse. Geben Sie im Feld Klicken die Bezeichnung MasterButton_Click ein.
Wiederholen Sie den vorherigen Schritt für die --Schaltfläche (Minuszeichen).
Doppelklicken Sie außerhalb der Steuerelemente auf die Seite, um einen Page_Load-Ereignishandler zu erstellen.
Fügen Sie im Handler den folgenden Code hinzu, um die zwei Schaltflächen als asynchrone Postbacksteuerelemente zu registrieren:
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); }
Fügen Sie zum Erstellen eines Click-Handlers mit dem Namen MasterButton_Click den folgenden Code hinzu:
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; }
Fügen Sie den folgenden Code hinzu, um auf der Masterseite eine öffentliche Eigenschaft mit dem Namen Offset zu erstellen, mit der die Differenz zwischen dem aktuellen und dem ausgewählten Datum nachverfolgt wird.
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;} }
Wechseln Sie auf der Inhaltsseite in die Entwurfsansicht, und doppelklicken Sie anschließend auf das Calendar-Steuerelement, um einen Ereignishandler für das SelectionChanged-Ereignis zu erstellen.
Fügen Sie dem SelectionChanged-Ereignishandler den folgenden Code hinzu. Mit dem Code wird die Offset-Eigenschaft festgelegt, wenn ein Benutzer ein Datum auswählt.
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; }
Wechseln Sie auf die Inhaltsseite, und fügen Sie einen Page_Load-Ereignishandler hinzu, mit dem das im Kalender ausgewählte Datum als aktuelles Datum festgelegt wird.
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; }
Fügen Sie der Seite eine @ MasterType-Direktive hinzu, sodass auf die Offset-Eigenschaft der Masterseite als Eigenschaft mit starker Typisierung verwiesen werden kann.
<%@ MasterType VirtualPath="MasterPage.master" %>
<%@ MasterType VirtualPath="MasterPage.master" %>
Wechseln Sie auf der Inhaltsseite in die Entwurfsansicht, und wählen Sie das UpdatePanel-Steuerelement aus.
Legen Sie im Eigenschaftenfenster für die UpdatePanelUpdateMode-Eigenschaft Conditional fest.
Speichern Sie die Änderungen. Drücken Sie anschließend STRG+F5, um die Seite in einem Browser anzuzeigen.
Klicken Sie im Kalender auf die Steuerelemente für den vorherigen bzw. nächsten Monat.
Der Kalender wird geändert, ohne dass die gesamte Seite aktualisiert wird.
Wählen Sie im Kalender ein Datum aus. Klicken Sie anschließend auf die Schaltflächen auf der Masterseite, um das ausgewählte Datum zu ändern.
Diese Änderungen werden durchgeführt, ohne die gesamte Seite zu aktualisieren.
Das Beispiel ist so formatiert, dass der Bereich der Seite, der das UpdatePanel-Steuerelement darstellt, deutlicher angezeigt wird.
<%@ Page Language="VB" MasterPageFile="MasterPage.master" Title="UpdatePanel in Master Pages" %> <%@ MasterType VirtualPath="MasterPage.master" %> <script > 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" UpdateMode="Conditional"> <ContentTemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" 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 > 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" UpdateMode="Conditional"> <ContentTemplate> <fieldset> <legend>UpdatePanel</legend> <asp:Calendar id="Calendar1" 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 > 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" > <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" > <div> Master Page<br /> <asp:ScriptManager ID="ScriptManager1" > </asp:ScriptManager> Change date <asp:Button ID="DecrementButton" Text="-" OnClick="MasterButton_Click" /> <asp:Button ID="IncrementButton" Text="+" OnClick="MasterButton_Click" /> <hr /> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" > </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 > 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" > <title>UpdatePanel in Master Pages</title> </head> <body> <form id="form1" > <div> Master Page<br /> <asp:ScriptManager ID="ScriptManager1" > </asp:ScriptManager> Change date <asp:Button ID="DecrementButton" Text="-" OnClick="MasterButton_Click" /> <asp:Button ID="IncrementButton" Text="+" OnClick="MasterButton_Click" /> <hr /> <br /> <asp:contentplaceholder id="ContentPlaceHolder1" > </asp:contentplaceholder> </div> </form> </body> </html>
Deaktivieren von Teilaktualisierungen von Seiten für eine Inhaltsseite
Wenn Sie einer Masterseite ein ScriptManager-Steuerelement hinzufügen, sind Teilaktualisierungen von Seiten standardmäßig für alle Inhaltsseiten aktiviert. Wenn Teilaktualisierungen von Seiten für einzelne Inhaltsseiten nicht ausgeführt werden sollen, können Sie diese Funktionalität deaktivieren. Dies ist empfehlenswert, wenn die Inhaltsseite benutzerdefinierte Steuerelemente enthält, die mit Teilaktualisierungen von Seiten nicht kompatibel sind.
So deaktivieren Sie Teilaktualisierungen von Seiten für eine Inhaltsseite
Erstellen Sie auf der Inhaltsseite für das Init-Ereignis der Seite einen Handler, mit dem die EnablePartialRendering-Eigenschaft des ScriptManager-Steuerelements auf false festgelegt wird.
Der Zustand der EnablePartialRendering-Eigenschaft muss geändert werden, bevor oder während das Init-Ereignis der Inhaltsseite auftritt.
Zusammenfassung
In diesem Lernprogramm wird erläutert, wie ein UpdatePanel-Steuerelement in Masterseiten verwendet wird. Wenn auf der Masterseite ein ScriptManager-Steuerelement verfügbar ist, können Sie auf Inhaltsseiten UpdatePanel-Steuerelemente ohne Deklaration eines ScriptManager-Steuerelements verwenden.
Das Teilrendering für eine einzelne Inhaltsseite muss programmgesteuert deaktiviert werden, wenn für die zugeordnete Masterseite das Teilrendering von Seiten aktiviert ist.
Siehe auch
Aufgaben
UpdatePanel-Steuerelement – Einführung
Erstellen einer einfachen ASP.NET-Seite mit mehreren UpdatePanel-Steuerelementen
Konzepte
Übersicht über ASP.NET-Masterseiten
Verwenden des ASP.NET UpdatePanel-Steuerelements mit datengebundenen Steuerelementen