Web 部件连接概述

更新:2007 年 11 月

Web 部件控件集使您能够在服务器控件之间创建连接,以便连接在一起的控件的总价值和有用性超过单个未连接的控件。提供了一组完整的集成连接组件,以便只执行很少的几个步骤,执行几行代码,无需处理所有的基础复杂性和数据同步,就可以使用现有的 WebPart(服务器或用户)控件形成连接。使用支持连接的控件,可以在运行时在控件之间创建动态的编程连接,以及创建在 Web 页的标记中声明的静态的预定义连接。您还可以向用户提供用户界面 (UI),使他们能够在运行时连接控件、与控件断开连接和管理现有连接。

连接为用户和开发人员提供了很多好处。通过使用连接,用户可以找到新的、有意义的查看数据的方式。假定您生成一个应用程序,其中服务器控件联系 Web 服务,返回某个省份日平均气温的历史记录,并以表格形式列出这些数据。如果用户要以不同的方式灵活地查看这些数据,可将该服务器控件连接到一个图表控件,该图表控件使用表格数据并用各种图表视图显示数据。甚至可以向用户提供这样的选项:以表格形式显示数据还是将气温数据连接到图表控件。使用新的数据视图,用户可以发现气温的新趋势和关系,而采用表格形式的数据很难体现这种关系。

通过使用连接,开发人员可以发现重用代码和组合独立控件功能的新机会。假定开发人员创建一个保存用户地址信息(包括邮政编码)的控件,并且在用户定购商品时始终可以使用此信息填写发货地址单。然后开发人员添加其他依赖于特定邮政编码的控件,如显示用户所在区域的天气信息和新闻标题的控件以及在给定邮政编码内按类别查找公司的控件。开发人员可以将每个新控件都设计为需要输入邮政编码,而不是将它们设计为具有保存邮政编码的相同功能。然后,开发人员只需将保存邮政编码的控件连接到将邮政编码作为输入项的天气、新闻和公司列表控件。每个连接都扩展了原始控件的作用,同时消除了新控件中的冗余代码。

连接概念

Web 部件连接是两个服务器控件之间的链接或关联,使二者可以共享数据。一个连接始终正好涉及两个控件:一个是数据提供者,另一个是提供者所提供数据的使用者。一个控件既可以是使用者,也可以是提供者,并且无论是 WebPart 控件、自定义控件还是用户控件,任意类型的服务器控件都可以设计为参与连接。默认情况下,提供者控件可以同时与多个使用者建立连接(如前一个示例中的邮政编码控件,它同时向天气信息控件、新闻标题控件和公司列表控件提供邮政编码)。默认情况下,使用者控件一次只能连接到一个提供者控件。

连接始终出现在 Web 部件应用程序的上下文中,这意味着除了参与连接的两个服务器控件外,网页中还要求有两个其他控件。其中一个是 WebPartManager 控件,它出现在包含 Web 部件控件的每个页中。第二个要求的控件是从 WebPartZoneBase 类继承的区域,如 WebPartZone 控件。为了形成连接,任何两个服务器控件都必须驻留在 WebPartZoneBase 类型的区域内。

在连接关系中,使用者和提供者都具有至少一个称为“连接点”的关联对象。根据 ConnectionPoint 类,连接点包含服务器控件连接到另一个控件所需的详细信息,如控件本身的类型、控件识别的数据的类型、连接点对象的 ID 以及控件是否可以形成多个连接。一个服务器控件可以具有多个连接点。提供者的连接点由 ProviderConnectionPoint 类的实例定义,而使用者的连接点则由 ConsumerConnectionPoint 类的实例定义。

要形成连接,使用者和提供者都必须都能识别相同类型的数据,这些数据在 Web 部件连接中通过接口实例传递。控件识别的数据的类型在与控件关联的连接点中的 InterfaceType 属性中指定。如果提供者和使用者识别相同类型的数据,则它们互相兼容。如果提供者和使用者不能互相兼容,则开发人员必须使用特殊的转换器对象将提供者的数据转换为使用者可以处理的形式。这个转换器对象从基 WebPartTransformer 类继承,开发人员可以从基类继承以开发自定义转换器或使用某个提供的转换器对象(RowToFieldTransformerRowToParametersTransformer)。

创建连接后,它包含在 WebPartConnection 对象中。连接对象封装有关连接的所有详细信息,包括对其使用者和提供者对象的引用、使用者和提供者的 ID、对任意连接点及其 ID 的引用、对与连接关联的任意转换器的引用以及有关连接状态的详细信息(如连接是否处于活动状态以及连接是处于静态还是动态)。

通过使用 ConnectionsZone 控件,您可以为用户提供一种创建和管理连接的方式。可以在网页上声明一个 <asp:connectionszone> 元素,它为用户提供一个运行时用户界面,使他们能够连接控件,或断开与控件的连接,以及配置某些连接详细信息。

连接的工作原理

Web 部件连接基于连接的“拉”模型,其中使用者从提供者那里获取数据。若要创建连接,作为数据提供者的控件将定义通信协定,表明该控件可提供的数据。作为使用者且知道该通信协定的另一个控件将检索这一数据。

建立连接的机制是一个特殊的回调方法:使用者和提供者中各有一个。但是,Web 部件控件集可处理全部的回调和通信详细信息,因此开发人员需要做的步骤很少。如果开发人员要使用最简单的方法,只需选择提供者中的一个方法用作回调方法并用 ConnectionProvider 属性在源代码中将它标记出来。然后在该方法中,返回包含传递给使用者的数据的接口实例。接口实例可以非常简单(例如,包含邮政编码等字符串值的单个属性)。提供者可以实现某个提供的接口(IWebPartFieldIWebPartRowIWebPartTable),但是大多数情况下最好用包含要与使用者共享数据的一个或多个属性或方法创建一个简单的自定义接口,并在提供者中实现该接口。使用者的回调方法检索来自提供者的接口实例。再次强调,开发人员所要做的只是(使用 ConnectionConsumer 属性)标识使用者中将检索接口实例的方法,并将它分配给某些处理和呈现的内部变量。注意,由于是在页和控件周期的预呈现阶段传递来自提供者的数据,因此在预呈现完成后您应计划在使用者中处理数据和更新任何逻辑。

ms178187.alert_note(zh-cn,VS.90).gif说明:

如上所述,使用者和提供者的接口类型必须互相兼容,否则它们必须使用 WebPartTransformer 对象建立连接。

交换数据的通道是使用者和提供者的连接点。您可以使用多种方法为控件创建连接点。如以上段落所述,可以使用 ConnectionConsumerAttributeConnectionProviderAttribute 类来创建连接点(每个类创建一个连接点)。在这种方法中,可以在源代码中将 ConnectionConsumer 属性添加到使用者的回调方法中,并采用类似方法将 ConnectionProvider 属性添加到提供者的回调方法中。这将标识各个回调方法并允许您指定有关连接点的某些详细信息,如 ID 和显示名(出现在用户界面中以便用户建立连接)。另外,还可以通过从 ConnectionPoint 继承来创建自定义连接点,或者可以使用 ConsumerConnectionPointProviderConnectionPoint 类或从这些类继承。如前所述,作为使用者或提供者的控件可以有多个连接点。

控件之间的连接可以为静态的或动态的。静态连接是在宿主页中以声明的方式进行编码并且在该页的预呈现阶段进行创建的。这可以确保在用户查看该页时连接处于活动状态。有关示例,请参见如何:声明两个 Web 部件控件之间的静态连接。动态连接可以在控件的代码中以编程的方式创建,也可以在宿主页上以声明的方式创建。如果在网页上的一个 WebPartZoneBase 区域中声明两个兼容的服务器控件,并在该页上声明 ConnectionsZone 控件的实例,则用户在运行时可以在控件之间创建和配置动态连接。

Web 部件连接和其他 ASP.NET 功能

采用多种方式将这些连接与其他 ASP.NET 技术(用于在 Web 应用程序内的控件之间传输信息)进行对比:

  • 连接是 Web 部件的一项功能。只可以连接为 Web 部件连接而设计的并且驻留在 WebPartZoneBase 区域中的控件。

    ms178187.alert_note(zh-cn,VS.90).gif说明:

    如前所述,任何 ASP.NET 服务器控件、自定义控件或用户控件都可用作 Web 部件控件来利用连接。

  • 连接不同于数据绑定。Web 部件区域内控件之间的连接通过使用接口在控件之间创建协定。数据绑定是控件与存储设备或后端数据库之间的一种连接。Web 部件连接仅在页上的控件之间移动数据。

  • 可以对连接进行个性化设置。指示所连接控件的连接设置可以与其他个性化设置数据安全地存储在一起。有关个性化的更多信息,请参见 Web 部件个性化设置概述

基本连接类

下表显示了 Web 部件控件集内对连接来说必不可少的三个组件,只要您使用连接,就会直接或间接使用这些组件。

Web 部件控件

说明

WebPartManager

管理某页上 Web 部件区域内控件之间的所有连接。每个 Web 部件页需要(且只需要)一个WebPartManager 控件。

WebPartZoneBase

WebPartZone

WebPartZoneBase 基类提供了必要的上下文,服务器控件可以在其中连接和交换数据。您可以从基类继承以创建自定义区域,或将 WebPartZone 控件用作实际区域以包含连接中涉及的服务器控件。

WebPartConnection

表示连接(涉及提供者和使用者)以及连接的所有其他必需组件。

ConnectionPoint

ProviderConnectionPoint

ConsumerConnectionPoint

ConnectionPoint 基类定义与使用者或提供者关联的对象,并包含交换数据所需的详细信息。ProviderConnectionPoint 与提供者关联,而 ConsumerConnectionPoint 与使用者关联。

ConnectionsZone

提供使用户能够在服务器控件之间创建运行时动态连接的用户界面。

请参见

任务

如何:声明两个 Web 部件控件之间的静态连接

概念

ASP.NET Web 部件概述

参考

WebPartConnection

ConnectionPoint

Web 部件控件集概述