ProxyWebPartManager-Klasse
Aktualisiert: November 2007
Stellt eine Möglichkeit für Entwickler zum Deklarieren von statischen Verbindungen auf einer Inhaltsseite bereit, wenn ein WebPartManager-Steuerelement in der der Inhaltsseite zugeordneten Masterseite deklariert wurde.
Assembly: System.Web (in System.Web.dll)
[BindableAttribute(false)] [AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class ProxyWebPartManager : Control
/** @attribute BindableAttribute(false) */ /** @attribute AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal) */ /** @attribute AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal) */ public class ProxyWebPartManager extends Control
public class ProxyWebPartManager extends Control
<asp:ProxyWebPartManager />
Das ProxyWebPartManager-Steuerelement ist für das spezielle Szenario des Deklarierens von statischen Verbindungen auf Inhaltsseiten vorhanden, wenn ein WebPartManager-Steuerelement bereits auf einer Masterseite deklariert wurde.
Es ist vorgesehen, dass eine Webseite, die Webparts-Steuerelemente verwendet, nur ein einziges WebPartManager-Steuerelement enthalten darf, das alle Webparts-Steuerelemente in der Seite verwaltet. Wenn eine Webparts-Anwendung Masterseiten verwendet,wird das WebPartManager-Steuerelement i. d. R. auf der Masterseite platziert, da alle Inhaltsseiten zur Laufzeit mit der Masterseite zusammengeführt werden. Das einzelne WebPartManager-Steuerlement verwaltet dann alle Webparts-Steuerelemente aus allen Inhaltsseiten. Entwickler können jedoch auf den Inhaltsseiten entsprechender Anwendungen scheinbar nur in begrenztem Maße statische Verbindungen deklarieren. Eine statische Webparts-Verbindung kann nur deklariert werden, indem ein <asp:webpartconnection>-Element als einem <staticconnections>-Element untergeordnet hinzugefügt wird, das wiederum selbst einem <asp:webpartmanager>-Element untergeordnet sein muss. Da aber das WebPartManager-Steuerelement bereits auf der Masterseite deklariert wurde und das einzig zulässige WebPartManager-Steuerelement ist, können Entwickler keine zusätzlichen WebPartManager-Steuerelemente auf den Inhaltsseiten deklarieren, um statische Verbindungen hinzuzufügen.
Das ProxyWebPartManager-Steuerelement ersetzt in diesem Szenario das WebPartManager-Steuerelement. Die Entwickler deklarieren ein <asp:proxywebpartmanager>-Element anstelle eines <asp:webpartmanager>-Elements auf den Inhaltsseiten und können dann statische Verbindungen als untergeordnete Elemente deklarieren. Zur Laufzeit werden die Verbindungen im ProxyWebPartManager-Steuerelement einfach der StaticConnections-Auflistung des WebPartManager-Steuerelements hinzugefügt und wie jede andere Verbindung behandelt.
Da das ProxyWebPartManager-Steuerelement nur in diesem speziellen Entwicklungsszenario verwendet wird, ist der Funktionsumfang im Vergleich zur WebPartManager-Klasse geringer. So erbt es tatsächlich nicht vom WebPartManager-Steuerelement, obwohl das ProxyWebPartManager-Steuerelement als Proxy fungiert, der statische Verbindungen für das WebPartManager-Steuerelement auf den Inhaltsseiten enthält. Es erbt direkt von der Control-Klasse und überschreibt nur einige der Basismember. Die Eigenschaften EnableTheming, Visible und SkinID werden überschrieben, und es werden ihnen Werte zugewiesen, die deren Verwendung verhindern. Andere geerbte Eigenschaften werden überschrieben, um deren Entwurfszeitverhalten anzupassen, ansonsten weisen diese das gleiche Verhalten auf wie die Basiseigenschaften. Diese schließen die Controls-Eigenschaft und die ClientID-Eigenschaft ein. Auderdem verfügt die ProxyWebPartManager-Klasse über eine nicht geerbte Eigenschaft. Die StaticConnections-Eigenschaft gibt ihre eigene Auflistung statischer Verbindungen (ein ProxyWebPartConnectionCollection-Objekt) zurück.
Wie bei Methoden überschreibt die ProxyWebPartManager-Klasse auf ähnliche Weise nur einige Methoden. Meist soll deren Verwendung beschränkt werden. Die geerbte Focus-Methode wird unbrauchbar gemacht, indem beim Aufrufen eine Ausnahme ausgelöst wird. Die CreateControlCollection-Methode gibt immer eine leere Auflistung von Steuerelementen zurück. Dadurch wird verhindert, dass sie eine Auflistung von Steuerelementen enthalten kann. Schließlich ruft die OnInit-Methode die Basismethode auf und weist dann der WebPartManager.StaticConnections-Eigenschaft des WebPartManager-Steuerelements die Verbindungsauflistung zu, auf die von der StaticConnections-Eigenschaft verwiesen wird. Dadurch werden alle statischen Verbindungen zusammengefasst, die auf sämtlichen Inhaltsseiten deklariert wurden. Sie werden Teil der Verbindungsauflistung, die vom WebPartManager-Steuerelement auf der Masterseite verwaltet wird.
Im folgenden Codebeispiel wird veranschaulicht, wie mithilfe der ProxyWebPartManager-Klasse auf Inhaltsseiten einer Anwendung mit Masterseiten statische Verbindungen deklariert werden. Das Beispiel besteht aus fünf Teilen:
Einem Benutzersteuerelement, mit dessen Hilfe Sie den Anzeigemodus auf einer Webparts-Seite wechseln können.
Quellcode für eine Schnittstelle und zwei WebPart-Steuerelementen, die als Anbieter und Consumer für eine Verbindung fungieren.
Einer Masterwebseite, die das Benutzersteuerelement, die Inhaltsseiten und das WebPartManager-Steuerelement für die Anwendung hostet.
Einer Inhaltswebseite, die ein ProxyWebPartManager-Steuerelement, die beiden benutzerdefinierten WebPart-Steuerelemente und eine statische Verbindung hostet, mit der die beiden Steuerelemente verbunden werden.
Einer Erklärung, wie die Beispielseite ausgeführt wird.
Beim ersten Teil dieses Codebeispiels handelt es sich um das Benutzersteuerelement, mit dem der Anzeigemodus auf einer Webseite geändert werden kann. Speichern Sie den folgenden Quellcode in einer ASCX-Datei. Geben Sie dieser den Dateinamen, der dem Src-Attribut der Register-Direktive für dieses Benutzersteuerelement zugewiesen ist, die sich im oberen Bereich der hostenden Masterseite befindet. Ausführliche Informationen zu Anzeigemodi und eine Beschreibung des Quellcodes in diesem Steuerelement finden Sie unter Exemplarische Vorgehensweise: Wechseln des Anzeigemodus auf einer Webparts-Seite.
<%@ control language="C#" classname="DisplayModeMenuCS"%> <script runat="server"> // Use a field to reference the current WebPartManager. WebPartManager _manager; void Page_Init(object sender, EventArgs e) { Page.InitComplete += new EventHandler(InitComplete); } void InitComplete(object sender, System.EventArgs e) { _manager = WebPartManager.GetCurrentWebPartManager(Page); String browseModeName = WebPartManager.BrowseDisplayMode.Name; // Fill the dropdown with the names of supported display modes. foreach (WebPartDisplayMode mode in _manager.SupportedDisplayModes) { String modeName = mode.Name; // Make sure a mode is enabled before adding it. if (mode.IsEnabled(_manager)) { ListItem item = new ListItem(modeName, modeName); DisplayModeDropdown.Items.Add(item); } } // If shared scope is allowed for this user, display the scope-switching // UI and select the appropriate radio button for the current user scope. if (_manager.Personalization.CanEnterSharedScope) { Panel2.Visible = true; if (_manager.Personalization.Scope == PersonalizationScope.User) RadioButton1.Checked = true; else RadioButton2.Checked = true; } } // Change the page to the selected display mode. void DisplayModeDropdown_SelectedIndexChanged(object sender, EventArgs e) { String selectedMode = DisplayModeDropdown.SelectedValue; WebPartDisplayMode mode = _manager.SupportedDisplayModes[selectedMode]; if (mode != null) _manager.DisplayMode = mode; } // Set the selected item equal to the current display mode. void Page_PreRender(object sender, EventArgs e) { ListItemCollection items = DisplayModeDropdown.Items; int selectedIndex = items.IndexOf(items.FindByText(_manager.DisplayMode.Name)); DisplayModeDropdown.SelectedIndex = selectedIndex; } // Reset all of a user's personalization data for the page. protected void LinkButton1_Click(object sender, EventArgs e) { _manager.Personalization.ResetPersonalizationState(); } // If not in User personalization scope, toggle into it. protected void RadioButton1_CheckedChanged(object sender, EventArgs e) { if (_manager.Personalization.Scope == PersonalizationScope.Shared) _manager.Personalization.ToggleScope(); } // If not in Shared scope, and if user is allowed, toggle the scope. protected void RadioButton2_CheckedChanged(object sender, EventArgs e) { if (_manager.Personalization.CanEnterSharedScope && _manager.Personalization.Scope == PersonalizationScope.User) _manager.Personalization.ToggleScope(); } </script> <div> <asp:Panel ID="Panel1" runat="server" Borderwidth="1" Width="230" BackColor="lightgray" Font-Names="Verdana, Arial, Sans Serif" > <asp:Label ID="Label1" runat="server" Text=" Display Mode" Font-Bold="true" Font-Size="8" Width="120" AssociatedControlID="DisplayModeDropdown"/> <asp:DropDownList ID="DisplayModeDropdown" runat="server" AutoPostBack="true" Width="120" OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" /> <asp:LinkButton ID="LinkButton1" runat="server" Text="Reset User State" ToolTip="Reset the current user's personalization data for the page." Font-Size="8" OnClick="LinkButton1_Click" /> <asp:Panel ID="Panel2" runat="server" GroupingText="Personalization Scope" Font-Bold="true" Font-Size="8" Visible="false" > <asp:RadioButton ID="RadioButton1" runat="server" Text="User" AutoPostBack="true" GroupName="Scope" OnCheckedChanged="RadioButton1_CheckedChanged" /> <asp:RadioButton ID="RadioButton2" runat="server" Text="Shared" AutoPostBack="true" GroupName="Scope" OnCheckedChanged="RadioButton2_CheckedChanged" /> </asp:Panel> </asp:Panel> </div>
Der zweite Teil des Codebeispiels ist der Quellcode für die Schnittstelle und die Steuerelemente. Die Quelldatei enthält die einfache Schnittstelle IZipCode. Außerdem gibt es eine WebPart-Klasse (ZipCodeWebPart), die die Schnittstelle implementiert und als Anbietersteuerelement fungiert. Die ProvideIZipCode-Methode ist die Rückrufmethode, die den einzigen Member der Schnittstelle implementiert. Die Methode gibt eine Instanz der Schnittstelle zurück. Beachten Sie, dass die Metadaten der Methode mit einem ConnectionProvider-Attribut markiert werden. Auf diese Weise wird die Methode als Rückrufmethode für den Verbindungspunkt des Anbieters identifiziert. Die andere WebPart-Klasse (WeatherWebPart) fungiert als Consumer für die Verbindung. Diese Klasse verfügt über die Methode GetZipCode, die eine Instanz der IZipCode-Schnittstelle aus dem Anbietersteuerelement abruft. Beachten Sie, dass diese Methode durch das ConnectionConsumer-Attribut in ihren Metadaten als Verbindungspunktmethode für den Consumer gekennzeichnet ist.
Um das Codebeispiel auszuführen, müssen Sie diesen Quellcode kompilieren. Sie können den Code explizit kompilieren und die sich ergebende Assembly im Ordner Bin der Website oder im globalen Assemblycache ablegen. Alternativ können Sie den Quellcode im Ordner App_Code der Site ablegen, wo er zur Laufzeit dynamisch kompiliert wird. In diesem Codebeispiel wird die dynamische Kompilierung verwendet. Eine exemplarische Vorgehensweise, in der die Kompilierung erläutert wird, finden Sie unter Exemplarische Vorgehensweise: Entwickeln und Verwenden eines benutzerdefinierten Serversteuerelements.
namespace Samples.AspNet.CS.Controls { using System; using System.Web; using System.Web.Security; using System.Security.Permissions; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public interface IZipCode { string ZipCode { get; set;} } [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class ZipCodeWebPart : WebPart, IZipCode { string zipCodeText = String.Empty; TextBox input; Button send; public ZipCodeWebPart() { } // Make the implemented property personalizable to save // the Zip Code between browser sessions. [Personalizable()] public virtual string ZipCode { get { return zipCodeText; } set { zipCodeText = value; } } // This is the callback method that returns the provider. [ConnectionProvider("Zip Code Provider", "ZipCodeProvider")] public IZipCode ProvideIZipCode() { return this; } protected override void CreateChildControls() { Controls.Clear(); input = new TextBox(); this.Controls.Add(input); send = new Button(); send.Text = "Enter 5-digit Zip Code"; send.Click += new EventHandler(this.submit_Click); this.Controls.Add(send); } private void submit_Click(object sender, EventArgs e) { if (input.Text != String.Empty) { zipCodeText = Page.Server.HtmlEncode(input.Text); input.Text = String.Empty; } } } [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class WeatherWebPart : WebPart { private IZipCode _provider; string _zipSearch; Label DisplayContent; // This method is identified by the ConnectionConsumer // attribute, and is the mechanism for connecting with // the provider. [ConnectionConsumer("Zip Code Consumer", "ZipCodeConsumer")] public void GetIZipCode(IZipCode Provider) { _provider = Provider; } protected override void OnPreRender(EventArgs e) { EnsureChildControls(); if (this._provider != null) { _zipSearch = _provider.ZipCode.Trim(); DisplayContent.Text = "My Zip Code is: " + _zipSearch; } } protected override void CreateChildControls() { Controls.Clear(); DisplayContent = new Label(); this.Controls.Add(DisplayContent); } } }
Der dritte Teil des Codebeispiels ist die Masterseite. Sie müssen den folgenden Quellcode in einer Datei mit dem Namen MasterPageCS.master oder MasterPageVB.master (je nach verwendeter Sprache) speichern. Beachten Sie, dass die Masterseite eine Register-Direktive für die Registrierung des Benutzersteuerelements enthält. Sie verweist auf das Steuerelement selbst im Textkörper der Seite. Die Masterseite deklariert auch das einzige <asp:webpartmanager>-Element, das für diese Seite und alle zugehörigen Inhaltsseiten verwendet wird. Schließlich weist die Masterseite ein <asp: contentplaceholder>-Element auf, das den Punkt auf der Seite deklariert, an dem die Inhaltsseite eingefügt wird.
<%@ Master Language="C#" %> <%@ register tagprefix="uc1" tagname="DisplayModeMenuCS" src="~/displaymodemenucs.ascx" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Master page with connections in content pages</title> </head> <body> <h2>Contoso, Ltd.</h2> <hr /> <form id="form1" runat="server"> <asp:webpartmanager runat="server" id="WebPartManager1" /> <uc1:displaymodemenucs id="menu1" runat="server" /> <div> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server" /> </div> </form> </body> </html>
Der vierte Teil des Codebeispiels ist die Inhaltsseite. Sie müssen den folgenden Quellcode kopieren und ihn in einer Datei mit einer ASPX-Erweiterung speichern. Beachten Sie, dass die Page-Direktive ein MasterFile-Attribut enthält, um auf die Masterseite zu verweisen. Diese Seite weist auch eine Register-Direktive auf, mit der die Datei im Ordner App_Code eingetragen wird. Dieser enthält die dynamisch kompilierten benutzerdefinierten WebPart-Steuerelemente für die Verbindung. Innerhalb der <asp:content>-Tags der Seite befindet sich ein <asp:proxywebpartmanager>-Element mit einem untergeordneten <staticconnections>-Element, das wiederum ein untergeordnetes <asp:webpartconnection>-Element zum Deklarieren der Einzelheiten der Verbindung aufweist. Innerhalb der <script>-Tags auf der Seite fügt die Button1_Click-Methode Code hinzu, der auf das WebPartManager-Hauptsteuerelement auf der Masterseite und das ProxyWebPartManager-Steuerelement auf der Inhaltsseite zugreift. Teile davon werden auf die Seite geschrieben.
<%@ Page Language="C#" MasterPageFile="~/MasterPageCS.master" Title="Connections Page" %> <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS.Controls" %> <script runat="server"> protected void Button1_Click(object sender, EventArgs e) { StringBuilder lblText = new StringBuilder(); if (Page.Master.FindControl("WebPartManager1") != null) { WebPartManager theMgr = (WebPartManager)Page.Master.FindControl("WebPartManager1"); lblText.Append("WebPartManager: <br /><pre>" + " Master page file is " + Page.MasterPageFile + "<br />" + " ID is " + theMgr.ID + "<br />" + " Connection count is " + theMgr.StaticConnections.Count.ToString() + "<br />" + " WebParts count is " + theMgr.WebParts.Count.ToString() + "</pre><br />"); } if (proxymgr1 != null) { lblText.Append("ProxyWebPartManager: <br /><pre>" + " Content page file is " + Request.Path + "<br />" + " ID is " + proxymgr1.ID + "<br />" + " Connection count is " + proxymgr1.StaticConnections.Count.ToString() + "</pre><br />"); } Literal1.Text = lblText.ToString(); } </script> <asp:Content ID="Content1" Runat="Server" ContentPlaceHolderID="ContentPlaceHolder1" > <asp:proxywebpartmanager id="proxymgr1" runat="server"> <staticconnections> <asp:webpartconnection id="connection1" consumerconnectionpointid="ZipCodeConsumer" consumerid="zipConsumer" providerconnectionpointid="ZipCodeProvider" providerid="zipProvider" /> </staticconnections> </asp:proxywebpartmanager> <div> <asp:webpartzone id="zone1" runat="server"> <zonetemplate> <aspsample:zipcodewebpart id="zipProvider" runat="server" title="Zip Code Provider" /> <aspsample:weatherwebpart id="zipConsumer" runat="server" title="Zip Code Consumer" /> </zonetemplate> </asp:webpartzone> </div> <div> <asp:button id="Button1" runat="server" text="WebPartManager Information" onclick="Button1_Click" /> <br /> </div> <asp:connectionszone id="ConnectionsZone1" runat="server" /> <asp:literal id="Literal1" runat="server" /> </asp:Content>
Klicken Sie nach dem Laden der Seite in einem Browser auf die Schaltfläche WebPartManager Information, und sehen Sie sich die Informationen zum WebPartManager-Steuerelement auf der Masterseite und zum ProxyWebPartManager-Steuerelement auf der Inhaltsseite an. Beachten Sie zum Beispiel, dass auf beiden der gleiche Zählwert in den entsprechenden Eigenschaften vorhanden ist, mit denen statische Verbindungen nachverfolgt werden (die StaticConnections-Eigenschaft). Beachten Sie außerdem, dass das WebPartManager-Steuerelement zwar eine WebParts-Eigenschaft aufweist, mit der die Anzahl der von ihr verwalteten WebPart-Steuerelemente nachverfolgt wird, das ProxyWebPartManager-Steuerelement aber keine entsprechende Eigenschaft aufweist, da sein einziger Zweck darin besteht, statische Verbindungen zu enthalten.
- AspNetHostingPermission
für den Betrieb in einer Hostumgebung. Anforderungswert: LinkDemand, Berechtigungswert: Minimal
- AspNetHostingPermission
für den Betrieb in einer Hostumgebung. Anforderungswert: InheritanceDemand, Berechtigungswert: Minimal
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
.NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.