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

ProviderConnectionPoint (Clase)

Define un objeto de punto de conexión que permite a un control de servidor que actúa como proveedor establecer una conexión con un consumidor.

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

public class ProviderConnectionPoint : ConnectionPoint
public class ProviderConnectionPoint extends ConnectionPoint
public class ProviderConnectionPoint extends ConnectionPoint
No aplicable.

En todas las conexiones de elementos Web entre dos controles de servidor, cada control debe tener, entre otros requisitos, un objeto de punto de conexión asociado que le permita conectarse a otro control y proporcionar o utilizar datos, en función de si el control se ha designado como proveedor o consumidor de la conexión. Un objeto ConnectionPoint contiene por lo general los detalles acerca de cómo un control puede conectarse a otro control y el tipo de datos que puede compartir. El punto de conexión de un control que actúa como proveedor en una conexión debe ser un objeto ProviderConnectionPoint. Para obtener información detallada sobre las conexiones de elementos Web y los puntos de conexión, lea los temas que se detallan en la sección Vea también, situada más adelante.

Para crear un objeto ProviderConnectionPoint, se requieren varios pasos:

  1. Crear una interfaz. Cuando un proveedor comparte datos con un consumidor, obtiene una instancia de una interfaz y devuelve esta instancia a un consumidor.

  2. Implementar la interfaz en un proveedor. Un control WebPart u otro control de servidor (se puede utilizar cualquier tipo de control de servidor de una zona WebPartZoneBase) que actúe como servidor deberá implementar la interfaz creada en el primer paso.

  3. Identificar un método de devolución de llamada. Debe identificarse un método en el proveedor como método de devolución de llamada para establecer establecer la conexión. Este método devuelve una instancia de la interfaz implementada a un consumidor. El enfoque de elementos Web para identificar un método de devolución de llamada en el proveedor consiste en agregar un atributo de metadatos ConnectionProvider (definido por la clase ConnectionProviderAttribute) al método que devuelve la instancia de la interfaz. Cuando se agrega el atributo, el único parámetro necesario es un nombre para mostrar que se va a utilizar en el punto de conexión del proveedor. Se pueden agregar también parámetros opcionales, como un identificador del punto de conexión.

Una vez que se ha equipado un control para que actúe como proveedor, el control puede participar en las conexiones (siempre que también esté equipado un control consumidor y se encuentre disponible). Para crear una conexión declarativa estática en el marcado de una página Web, los desarrolladores pueden utilizar el elemento <asp:webpartconnection>. Si el atributo ConnectionProvider del código fuente del proveedor que identifica al método de devolución de llamada especifica un identificador para el punto de conexión, el valor debe asignarse al atributo ProviderConnectionPointID del elemento <asp:webpartconnection> de una página. Un motivo por el que un desarrollador podría especificar un identificador para un punto de conexión del proveedor es que existan varios puntos de conexión en el control proveedor. Si no se especifica un identificador para el punto de conexión del proveedor en el control proveedor, tampoco tiene que asignarse un valor al atributo ProviderConnectionPointID en la página porque la conexión se creará utilizando el valor predeterminado que se obtiene del campo DefaultID.

Para crear una conexión en el código, los desarrolladores deben crear un nuevo objeto ProviderConnectionPoint; para ello, tienen que llamar al método GetProviderConnectionPoints y transferirle el identificador del control proveedor junto con el identificador o el índice del objeto ProviderConnectionPoint definido en el control proveedor. El objeto ProviderConnectionPoint devuelto junto con una referencia al control proveedor, una referencia al control consumidor y un objeto ConsumerConnectionPoint correspondiente, se transfieren al método ConnectWebParts para crear un nuevo objeto WebPartConnection.

Aunque los desarrolladores pueden utilizar puntos de conexión del proveedor en el establecimiento de la conexión mediante declaración o programación, los usuarios también pueden interactuar con los puntos de conexión del proveedor para establecer la conexión a través de la interfaz de usuario. Si los desarrolladores declaran un control ConnectionsZone en una página Web, éste proporciona una interfaz de usuario en tiempo de ejecución a los usuarios para crear conexiones. Si los usuarios seleccionan el control consumidor como punto de inicio para establecer la conexión al hacer clic en su verbo conectar (también podrían seleccionar el control proveedor, puesto que no hay diferencia en la conexión resultante), en la interfaz de usuario verán un control de lista desplegable con el nombre para mostrar del punto de conexión del consumidor disponible (o los puntos, si es que hay varios). Los usuarios deben seleccionar un punto de conexión del proveedor para crear una conexión.

Un objeto ProviderConnectionPoint se asocia directamente con un control proveedor específico y guarda los detalles sobre una conexión en las propiedades que hereda de la clase base ConnectionPoint. Por ejemplo, en la propiedad InterfaceType heredada, un punto de conexión del proveedor guarda el tipo de interfaz devuelto por el proveedor. Si tanto el proveedor como el consumidor de una conexión trabajan con el mismo tipo de interfaz, los controles son compatibles y capaces de formar una conexión directa. Si el proveedor y el consumidor no pueden trabajar con el mismo tipo de interfaz, son incompatibles y deben utilizar un objeto WebPartTransformer para traducir el valor InterfaceType del punto de conexión del proveedor a un tipo con el que el consumidor pueda trabajar. Otra propiedad importante heredada es la propiedad DisplayName, que proporciona un nombre descriptivo que aparece en la interfaz de usuario para que los usuarios elijan un punto de conexión del proveedor al crear conexiones. El nombre para mostrar es el parámetro necesario cuando los desarrolladores agregan un atributo ConnectionProvider al método de devolución de llamada en un control proveedor. La propiedad heredada ID también resulta útil, como se mencionó anteriormente, porque proporciona un identificador único para un punto de conexión del proveedor en caso de que un proveedor tenga varios puntos de conexión. Un proveedor puede tener varios objetos ProviderConnectionPoint definidos y, en este caso, cuando los desarrolladores agregan el atributo ConnectionProvider a un método, deben especificar un valor de identificación para distinguir cada punto de conexión. Otra propiedad heredada importante es la propiedad AllowsMultipleConnections, que indica si un punto de conexión del proveedor puede conectarse simultáneamente a varios consumidores. El valor de esta propiedad es true de forma predeterminada para los puntos de conexión del proveedor (mientras que tiene como valor predeterminado false para los puntos de conexión del consumidor).

La clase ProviderConnectionPoint agrega varios métodos únicos a los miembros que hereda de la clase ConnectionPoint. El método GetObject recupera una instancia de la interfaz que el método de devolución de llamada devolverá a los consumidores. El método GetSecondaryInterfaces recupera interfaces de consumidor adicionales que forman parte de una conexión existente, pero no recupera las interfaces que se utilizan para establecer la conexión.

En el ejemplo de código siguiente se muestran métodos sencillos para crear una conexión mediante declaración, mediante programación o a través de la interfaz de usuario; en todos los casos se utiliza un punto de conexión del proveedor.

Este ejemplo consta de cuatro 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 para alojar todos los controles y ejecutar el ejemplo de código.

  • 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 Web 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 el 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. Éste es el mecanismo para identificar el método de punto de conexión en el control consumidor.

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 Web. Cerca de la parte superior están las directivas Register para registrar los controles que forman la conexión y el control de usuario que permite a los usuarios modificar los modos de presentación de la página. La propia conexión se crea mediante declaración dentro del elemento <staticconnections> de la página. En este ejemplo se expone una forma de crear una conexión (observe el atributo ProviderConnectionPointID del elemento <asp:webpartconnection>). También puede crear la conexión mediante programación; el código correspondiente se encuentra en el método Button1_Click. En este caso, se crea un objeto ProviderConnectionPoint y, a continuación, se transfiere a un método que crea la conexión real. Si la conexión se crea mediante declaración o mediante programación, los puntos de conexión siempre deben especificarse tanto para el proveedor como para el consumidor. El método Button2_Click obtiene acceso a los objetos ConnectionPoint del proveedor y el consumidor y escribe algunos de los valores de sus propiedades en una etiqueta de la página.

<%@ Page Language="C#" %>
<%@ register tagprefix="uc1" 
    tagname="DisplayModeMenuCS"
    src="~/displaymodemenucs.ascx" %>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.CS.Controls" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  protected void Button1_Click(object sender, EventArgs e)
  {
    ProviderConnectionPoint provPoint =
      mgr.GetProviderConnectionPoints(zip1)["ZipCodeProvider"];
    ConsumerConnectionPoint connPoint =
      mgr.GetConsumerConnectionPoints(weather1)["ZipCodeConsumer"];
      
    if(mgr.CanConnectWebParts(zip1, provPoint, weather1, connPoint))
      mgr.ConnectWebParts(zip1, provPoint, weather1, connPoint);
  
  }  
  protected void Button2_Click(object sender, EventArgs e)
  {
    WebPartConnection conn = mgr.Connections[0];
    
    lblConn.Text = "<h2>Connection Point Details</h2>" + 
       "<h3>Provider Connection Point</h3>" + 
       "  Display name: " + conn.ProviderConnectionPoint.DisplayName + 
       "<br />" + 
       "  ID: " + conn.ProviderConnectionPoint.ID + 
       "<br />" + 
       "  Interface type: " + 
        conn.ProviderConnectionPoint.InterfaceType.ToString() + 
       "<br />" + 
       "  Control type: " + conn.ProviderConnectionPoint.ControlType.ToString() + 
       "<br />" + 
       "  Allows multiple connections: " + 
          conn.ProviderConnectionPoint.AllowsMultipleConnections.ToString() + 
       "<br />" + 
       "  Enabled: " + conn.ProviderConnectionPoint.GetEnabled(zip1).ToString() + 
       "<hr />" + 
       "<h3>Consumer Connection Point</h3>" + 
       "  Display name: " + conn.ConsumerConnectionPoint.DisplayName + 
       "<br />" + 
       "  ID: " + conn.ConsumerConnectionPoint.ID + 
       "<br />" + 
       "  Interface type: " + conn.ConsumerConnectionPoint.InterfaceType.ToString() + 
       "<br />" + 
       "  Control type: " + conn.ConsumerConnectionPoint.ControlType.ToString() + 
       "<br />" + 
       "  Allows multiple connections: " + 
          conn.ConsumerConnectionPoint.AllowsMultipleConnections.ToString() + 
       "<br />" + 
       "  Enabled: " + conn.ConsumerConnectionPoint.GetEnabled(zip1).ToString();
  }

  protected void Page_Load(object sender, EventArgs e)
  {
    lblConn.Text = String.Empty;
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:WebPartManager ID="mgr" runat="server" >
        <StaticConnections>
          <asp:WebPartConnection ID="conn1"
            ConsumerConnectionPointID="ZipCodeConsumer"
            ConsumerID="weather1" 
            ProviderConnectionPointID="ZipCodeProvider" 
            ProviderID="zip1" />
        </StaticConnections>      
      </asp:WebPartManager>
      <uc1:displaymodemenucs id="menu1" runat="server" />
      <asp:WebPartZone ID="WebPartZone1" runat="server">
        <ZoneTemplate>
          <aspSample:ZipCodeWebPart ID="zip1" runat="server"
            Title="Zip Code Provider"  />
          <aspSample:WeatherWebPart ID="weather1" runat="server" 
            Title="Zip Code Consumer" />
        </ZoneTemplate>
      </asp:WebPartZone>
      <asp:ConnectionsZone ID="ConnectionsZone1" runat="server">
      </asp:ConnectionsZone>
      <asp:Button ID="Button1" runat="server" 
        Text="Dynamic Connection" 
        OnClick="Button1_Click" />      
      <br />
      <asp:Button ID="Button2" runat="server" 
        Text="Connection Point Details" 
        OnClick="Button2_Click" />
      <br />
      <asp:Label ID="lblConn" runat="server" />
    </div>
    </form>
</body>
</html>

Después de cargar la página en un explorador, haga clic en el botón Detalles del punto de conexión. Aparece información sobre los puntos de conexión del proveedor y el consumidor establecidos en la conexión declarativa. A continuación, utilice el control desplegable Modo de presentación para cambiar la página en modo de conexión. En el menú de verbos del control ZIP Code ConsumerWebPart (representado por una flecha hacia abajo en la barra de títulos), haga clic en el verbo Conectar. Aparece la interfaz de usuario de conexión, que el control <asp:connectionszone> declarado en la página crea automáticamente. Ésta es otra manera de crear una conexión (a través de la interfaz de usuario), además de los métodos declarativos y de programación mencionados anteriormente. Haga clic en el botón Desconectar para finalizar la conexión estática existente. Haga clic en el vínculo Crear una conexión para un proveedor. La interfaz de usuario ahora muestra un control desplegable en el que aparece el nombre para mostrar del punto de conexión del proveedor. Seleccione el punto de conexión en la lista desplegable y, a continuación, haga clic en Conectar para finalizar la conexión. A continuación, haga clic de nuevo en Desconectar. A continuación, haga clic en el botón Conexión dinámica para crear una conexión mediante programación. Utilice el control Modo de presentación para devolver la página al modo de exploración. Haga clic de nuevo en el botón Detalles del punto de conexión para indicar una vez más detalles sobre el objeto de punto de conexión del proveedor.

En este ejemplo se ha expuesto cómo se establece una conexión y se utiliza un punto de conexión del proveedor de tres modos: una conexión estática declarada en el marcado de la página Web, una conexión creada en código que utiliza un objeto ProviderConnectionPoint y una conexión creada a través de la interfaz de usuario de conexión.

  • 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.WebControls.WebParts.ConnectionPoint
    System.Web.UI.WebControls.WebParts.ProviderConnectionPoint

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: