Esta documentación está archivada y no tiene mantenimiento.

ProxyWebPartManager (Clase)

Proporciona a los desarrolladores un mecanismo para declarar conexiones estáticas en una página de contenido cuando se ha declarado un control WebPartManager en la página principal asociada a las páginas de contenido.

Espacio de nombres: System.Web.UI.WebControls.WebParts
Ensamblado: System.Web (en system.web.dll)

[BindableAttribute(false)] 
public class ProxyWebPartManager : Control
/** @attribute BindableAttribute(false) */ 
public class ProxyWebPartManager extends Control
BindableAttribute(false) 
public class ProxyWebPartManager extends Control
No aplicable.

El control ProxyWebPartManager se utiliza en el caso concreto en que haya que declarar conexiones estáticas en páginas de contenido cuando ya se ha declarado un control WebPartManager en una página principal.

Por su diseño, una página Web que utiliza controles de elementos Web debe contener un control WebPartManager (y solamente uno) que administre todos los controles de elementos Web de la página. Cuando una aplicación de elementos Web utiliza páginas principales, lo normal es situar el control WebPartManager en la página principal, ya que todas las páginas de contenido se combinarán con la página principal en tiempo de ejecución y el control WebPartManager administrará en solitario todos los controles de elementos Web procedentes de las páginas de contenido. Sin embargo, cuando los desarrolladores deseen declarar conexiones estáticas en las páginas de contenido de una aplicación de este tipo, puede parecer que se enfrentan a una limitación. Una conexión estática de elementos Web sólo se puede declarar agregando un elemento <asp:webpartconnection> como elemento secundario de un elemento <staticconnections>, que, a su vez, debe ser un elemento secundario de un elemento <asp:webpartmanager>. Pero como el control WebPartManager ya se ha declarado en la página principal y sólo se permite un control WebPartManager, los desarrolladores no pueden declarar controles WebPartManager adicionales en las páginas de contenido para agregar conexiones estáticas.

En estas circunstancias, el control ProxyWebPartManager toma el lugar del control WebPartManager. Los desarrolladores declaran un elemento <asp:proxywebpartmanager> en lugar de un elemento <asp:webpartmanager> en sus páginas de contenido, y pueden declarar a continuación las conexiones estáticas como elementos secundarios. En tiempo de ejecución, las conexiones del control ProxyWebPartManager simplemente se agregan a la colección StaticConnections del control WebPartManager y se tratan como cualquier otra conexión.

Como el control ProxyWebPartManager sólo se utiliza en estas determinadas circunstancias de desarrollo, tiene una funcionalidad más limitada que la clase WebPartManager. De hecho, aunque el control ProxyWebPartManager actúe como un servidor proxy que contiene conexiones estáticas para el control WebPartManager en las páginas de contenido, no se hereda del control WebPartManager. Se hereda directamente de la clase Control y reemplaza sólo a unos pocos miembros base. Las propiedades EnableTheming, Visible y SkinID se reemplazan, y se les asignan valores que impiden que se utilicen. También se reemplazan otras propiedades heredadas para ajustar su comportamiento en tiempo de diseño, ya que, de lo contrario, tendrían el mismo comportamiento que las propiedades base. Entre estas propiedades se incluyen Controls y ClientID. Por último, la clase ProxyWebPartManager tiene una propiedad no heredada. La propiedad StaticConnections devuelve su propia colección de conexiones estáticas (un objeto ProxyWebPartConnectionCollection).

En cuanto a los métodos, la clase ProxyWebPartManager también reemplaza únicamente a unos pocos métodos, principalmente para restringir su uso. El método Focus heredado se vuelve inutilizable, ya que se produce una excepción si se llama a este método. El método CreateControlCollection siempre devuelve una colección de controles vacía, lo que impide que pueda contener una colección de controles. Por último, el método OnInit llama al método base y, a continuación, asigna la colección de conexiones a la que la propiedad StaticConnections hace referencia a la propiedad WebPartManager.StaticConnections del control WebPartManager. La finalidad de esto es agrupar todas las conexiones estáticas declaradas en todas las páginas de contenido y hacer que formen parte de la colección de conexiones que el control WebPartManager mantiene en la página principal.

En el ejemplo de código siguiente se muestra cómo de utiliza la clase ProxyWebPartManager para declarar conexiones estáticas en páginas de contenido de una aplicación que utiliza páginas principales. El ejemplo se compone de cinco partes:

  • Un control de usuario que permite cambiar el modo de presentación de los elementos Web de una página.

  • El código fuente de una interfaz y dos controles WebPart que actúan como proveedor y consumidor en una conexión.

  • Una página Web principal que aloja el control de usuario, las páginas de contenido y el control WebPartManager de la aplicación.

  • Una página Web de contenido que aloja un control ProxyWebPartManager, los dos controles WebPart personalizados y una conexión estática que va a conectar los dos controles.

  • Una explicación sobre cómo se ejecuta la página de ejemplo.

La primera parte de este ejemplo de código es un control de usuario que permite a los usuarios cambiar los modos de presentación de una página Web. Guarde el código fuente siguiente en un archivo .ascx y póngale el nombre de archivo que se ha asignado al atributo Src de la directiva Register de este control de usuario, que está situado cerca de la parte superior de la página principal en que se aloja. Para obtener más información sobre los modos de presentación y una descripción del código fuente de este control, vea Tutorial: Cambiar los modos de presentación en una página de elementos Web.

<%@ 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="&nbsp;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>

La segunda parte del ejemplo es el código fuente de la interfaz y los controles. El archivo de código fuente contiene una interfaz simple denominada IZipCode. Hay también una clase WebPart denominada ZipCodeWebPart que implementa la interfaz y actúa como control proveedor. Su método ProvideIZipCode es el método de devolución de llamada que implementa el único miembro de la interfaz. El método simplemente devuelve una instancia de la interfaz. Observe que el método se marca con un atributo ConnectionProvider en sus metadatos. Este mecanismo sirve para identificar el método de devolución de llamada del punto de conexión del proveedor. La otra clase WebPart se denomina WeatherWebPart y actúa como consumidor en la conexión. Esta clase tiene un método denominado GetZipCode que recibe una instancia de la interfaz IZipCode del control proveedor. Observe que este método se marca como método de punto de conexión del consumidor con un atributo ConnectionConsumer en sus metadatos.

Para que el ejemplo de código funcione, es necesario compilar este código fuente. Se puede compilar de manera explícita y colocar el ensamblado resultante en la carpeta Bin del sitio Web o en la caché de ensamblados global. El código fuente también se puede colocar en la carpeta App_Code del sitio Web, donde se compilará dinámicamente en tiempo de ejecución. En este ejemplo de código se utiliza compilación dinámica. Para consultar un tutorial en el que se muestra cómo se compila, vea Tutorial: Desarrollar y utilizar un control de servidor personalizado.

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);
    }

  }

}

La tercera parte del ejemplo de código es la página principal. Debería tomar el siguiente código fuente y guardarlo en un archivo, asignándole el nombre MasterPageCS.master o MasterPageVB.master (dependiendo del lenguaje que esté utilizando). Tenga en cuenta que la página principal contiene una directiva Register para registrar el control de usuario y que ésta hace referencia al propio control de usuario en el cuerpo de la página. La página principal también declara el único elemento <asp:webpartmanager> utilizado en esta página y todas las páginas de contenido relacionadas. Por último, la página principal tiene un elemento <asp: contentplaceholder> que declara el punto de la página en el que se inserta la página de contenido.

<%@ 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>

La cuarta parte del ejemplo de código es la página de contenido. Debería copiar el código fuente siguiente y guardarlo en un archivo con una extensión .aspx. Observe que su directiva Page contiene un atributo MasterFile que hace referencia a la página principal. Además, esta página tiene una directiva Register para registrar el archivo de la carpeta App_Code que contiene los controles WebPart personalizados compilados dinámicamente que participan en la conexión. En las etiquetas <asp:content> de la página, hay un elemento <asp:proxywebpartmanager> con un elemento <staticconnections> secundario, que, a su vez, tiene un elemento <asp:webpartconnection> secundario para declarar los detalles de la conexión. En las etiquetas <script> de la página, el método Button1_Click agrega cierto código que obtiene acceso al control WebPartManager principal de la página principal y al control ProxyWebPartManager de la página de contenido, y escribe algunos de los detalles en la página.

<%@ 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>

Después de cargar la página en un explorador, haga clic en el botón Información sobre WebPartManager y observe la información sobre el control WebPartManager en la página principal y el control ProxyWebPartManager en la página de contenido. Observe, por ejemplo, que los dos controles tienen el mismo recuento en sus respectivas propiedades que efectúan el seguimiento de las conexiones estáticas (la propiedad StaticConnections). Tenga en cuenta también que, aunque el control WebPartManager tiene una propiedad WebParts que efectúa el seguimiento del número de controles WebPart que administra, el control ProxyWebPartManager no tiene ninguna propiedad de este estilo, ya que su única finalidad es contener conexiones estáticas.

  • AspNetHostingPermission  para trabajar en un entorno alojado en host. Valor de la petición: LinkDemand; valor del permiso: Minimal
  • AspNetHostingPermission  para trabajar en un entorno alojado en host. Valor de la petición: InheritanceDemand; valor del permiso: Minimal

System.Object
   System.Web.UI.Control
    System.Web.UI.WebControls.WebParts.ProxyWebPartManager

Los miembros estáticos públicos (Shared en Visual Basic) de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter

Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

.NET Framework

Compatible con: 3.0, 2.0
Mostrar: