Web 部件的控件集能够让你创建服务器控件之间的连接,这些已连接控件的价值和可用性都超过了单独的、未连接的控件。现在已经有一个完整的、已整合的连接组件集,所以只需要少量的步骤、少数的代码、且不需要进行复杂的底层处理以及数据同步,你就能够对现有的来自于连接的 WebPart 控件(服务器控件或者用户控件)进行配备。通过连接所启用的控件,你可以在运行时的控件之间动态创建可编程连接,亦或是被声明在 Web 页面标记中的静态预定义连接。你也可以为用户提供一个用户界面(UI),以能够让它们在运行时与控件进行连接或断开,并对现有的连接进行管理。
连接为用户和开发者提供了诸多优势。通过使用连接,用户能够找到新的方法来查看他们的数据。假设你建立了一个通过服务器控件与 Web 服务进行联系的应用程序,其中返回某个城市的日常温度平均计数的历史记录,最后把数据列在列表窗体中。如果某个用户需要通过不同的方式来查看数据,这个服务器控件可以被连接到一个能够使用列表数据并能够以不同的图表视图进行显示的图表控件。用户甚至可以指定温度选项,来定制表格中(或者把温度数据连接到图表控件)显示的数据。通过新的数据视图,用户可能会注意到一个新的趋势和温度的关系,那就是在列表窗体中对数据进行可视化的操作会更麻烦一些。
通过使用连接,开发者能够发现代码重用,以及单独控件的功能性结合的新契机。假设某个开发者创建了一个为用户保存地址信息的控件,包括一个邮递代码,并在定购物品的时候在运送地址中始终保持该代码的有效信息。然后开发者添加其他依赖于特定邮递代码的控件,如在用户区域中显示天气信息和新闻头条的控件,以及使用给定邮递代码中的目录来查找商机。这胜过于使用保存邮递代码的相同特征对每一个新的控件进行设计,开发者可以把每个控件设计成要求输入一个邮递代码。然后开发者可以简单的连接到这些已经为天气、新闻、以及商机保存有邮递代码的控件,这些控件都需要获取一个邮递代码作为输入。每个连接都扩充了原始控件的有效性,并消除了新控件中的冗余代码。
连接的概念
一个 Web 部件的连接就是一个链接或者在两个服务器之间的联合,以使得它们之间能够共享数据。一个连接中始终包括有两个控件:一个是数据的提供者,而另一个是对数据的消费者。一个控件既可以是消费者也可以是提供者,并且任何类型的服务器控件(不管是 WebPart 控件、自定义控件、或者用户控件),都可以被设计成连接的一部分。提供者控件在默认时能够同时与多个消费者之间建立连接(这与前面所讲的为天气控件、新闻头条控件、以及商务列表控件提供邮递代码的控件实例相似)。而消费者控件默认时只能够同时连接到一个提供者。
连接始终位于 Web 部件应用程序的环境中,意味着至少应该在连接器中的两个服务器控件之间,页面中有两个额外的控件是必需的。其中的一个是 WebPartManager 控件,它展示在每个包含 Web 部件控件的页面中。第二个必需的控件是一个继承自 WebPartZoneBase 类的区域,如 WebPartZone 控件。任何的两个服务器控件,为了用于包含于连接,必须位于一个 WebPartZoneBase 类型的区域中。
在连接的关系中,消费者和提供者各自至少拥有一个相关联的对象,该对象就是连接点。基于 ConnectionPoint 类,连接点包含服务器控件连接到其他控件时所必需的细节,如控件本身的类型,被控件所认可的数据类型,包括连接点对象的 ID,以及控件是否能够来自于多个连接。一个服务器控件可以拥有多个连接点。一个提供者的连接点通过 ProviderConnectionPoint 的实例被定义,并且消费者通过 ConsumerConnectionPoint 的实例被定义。
要来自于一个连接,消费者和提供者都必须对相同类型的数据(在 Web 部件的连接中被一个接口实例的方法所传递)进行认可,通过使用 InterfaceType 属性,控件认可的数据类别可以在控件的已关联连接点中被指定。如果提供者和消费者都认可相同的数据类型,那么说它们是相互兼容的。如果某个提供者和消费者没有相互兼容,那么开发者就必须使用一个特定的转换器对象把提供者的数据转换进消费者能够与之工作的窗体中。这个转换器对象继承自开发自定义转换器的基类,或者使用一个已提供的转换器对象(RowToFieldTransformer 或 RowToParametersTransformer )。
在连接被创建之后,它被包含进一个 WebPartConnection 对象。这个连接对象封装了所有与连接相关的细节,包括对它的消费者和提供者对象的引用、消费者和提供者的 ID、对任何连接点和连接点 ID 的引用、任何与连接相联系的转换器的引用、以及关于连接状态的细节(如它是否是活动的以及是否是静态或者动态的)。
你可以使用 ConnectionsZone 控件为用户提供一种途径来创建并管理连接。你可以在 Web 页面中声明一个 <Asp:ConnectionsZone> 元素,以提供给用户一个运行时的 UI,并允许他们连接或者断开控件的连接,并配置特定连接的细节。
连接如何工作
Web 部件的连接基于连通“推出”模型,即消费者从提供者那里获取数据。要创建一个连接,就需要一个控件来扮演数据提供者的角色,并定义一个指明它能够提供数据的通讯约定。而另一个控件,则扮演消费者的角色,遵循相关的通讯约定,并获取数据。
建立连接的机制实际上是一个特定的回调方法:在消费者和提供者中各有一个。但是,Web 部件的控件集处理所有的回调过程和通讯细节,所以开发者只需要完成必需的几个步骤即可。作为开发者,如果你需要使用最简单的方法,那么你所做的仅仅是在提供者所使用的回调方法中任选一种。并在源代码中使用 ConnectionProvider 参数对它进行标记。然后使用这个方法,返回包含传递给消费者的数据的接口实例。这个接口实例可以非常简单(例如,一个类似于邮递代码的字符串参数)。提供者可以实现被提供接口中的任何一种(IWebPartField ,IWebPartRow , 或者 IWebPartTable ),但是在多数情况下它要比使用一个或多个属性或方法(包含你需要与消费者共享的数据)创建简单的自定义接口要来得更优越一些,并且在提供者中实现这个接口。消费者的回调方法从提供者那里获取该接口的一个实例。另外,所有的这些在消费者对获取接口实例的方法进行识别(使用 ConnectionConsumer 参数)的时候是必须的,并把它指派到一些用于处理和呈现的内部变量。注意来自于提供者的数据在页面和控件周期的预呈现阶段被传递,所以你应该开始计划对数据进行处理并且在预呈现完成之后更新消费者中的任何逻辑。
提示:与前面所提到的一样,消费者和提供者必须使用接口类型来保持相互之间的兼容,否则它们就必须通过使用 WebPartTransformer 来建立连接。
连接点就是在消费者和提供者之间交换数据的途径。你可以使用多种方式来为控件创建连接点。与前面所提及的一样,你可以使用 ConnectionConsumerAttribute 或 ConnectionProviderAttribute 类,它们都可以为你创建连接点。在这个方法中,你可以在源代码中为消费者的回调方法添加 ConnectionConsumer 参数,然后按照相同的方式在提供者的回调方法中添加 ConnectionProvider 参数。这个参数用来对各个回调方法进行识别,并允许你指定连接点的一些相关细节,如 ID 和显示的名称(出现在来自于连接的用户的 UI 中)。作为另外一种替代方式,你可以创建一个继承自 ConnectionPoint 的自定义连接点,你也可以使用或者继承自 ConsumerConnectionPoint 或 ProviderConnectionPoint 类。与前面所提示的一样,控件所扮演的角色既可以是消费者也可以是拥有多个连接点的提供者。
控件之间的连接既可以是静态的也可以是动态的。静态连接被代码声明在托管页面以及在页面的预呈现事件中。以确保连接在用户查看页面的时候是活动的。关于具体的实例,请参考“ASP.NET 实践:在两个 Web 部件控件之间声明静态连接”。动态连接既可以通过编程来创建也可以通过在托管页面中进行声明来创建。如果你在页面的 WebPartZoneBase 区域中声明了两个相互兼容的服务器控件,并在页面中声明了 ConnectionZone 控件的一个实例,用户就可以在运行时为控件之间创建并配置动态的连接。
Web 部件的连接和其他 ASP.NET 特征
连接与使用其他在控件之间传输信息的 ASP.NET 技术对比而言:
-
连接是 Web 部件的特征。你只能够连接到为 Web 部件的连接而设计的控件,此类控件必须位于 WebPartZoneBase 区域之间。
提示:与前面的提示一样,任何 ASP.NET 服务器控件、自定义控件、或者用户控件都能够当成 Web 部件控件来使用。
-
连接区别于数据绑定。Web 部件区域中控件之间的连接使用一个接口来创建控件之间的约定。虽然数据绑定也是控件之间的连接,但它同样也是存储设备或者后端数据库之间的连接。Web 部件的连接只从页面中的控件之间移动数据。
-
连接能够被个性化。连接的设定指明了只有已连接控件才能够被安全地与其他个性化数据一起被保存。更多个性化的信息,请参考“Web 部件个性化概览”。
连接类的本质
下列表格显示了 Web 部件的控件集中的三个组件,它们是连接的本质,并且只要你使用了连接,你都将不可避免地需要直接或者间接地与之进行操作。
Web 部件控件 |
描述 |
WebPartManager
|
在页面的 Web 部件区域中管理控件之间的所有连接。每个 Web 部件页面中都必需要有一个(并且是唯一的一个)WebPartManager 控件。
|
WebPartZoneBase
WebPartZone
|
WebPartZoneBase 基类为能够连接并交换数据的服务器控件提供了必需的环境。你可以继承这个基类来创建一个自定义的区域,或者把 WebPartZone 控件当成实际的区域来包含连接中有关的服务器控件。
|
WebPartConnection
|
展示一个连接,并对提供者和消费者进行引用,以及连接中所有其他必需的组件。
|
ConnectionPoint
ProviderConnectionPoint
ConsumerConnectionPoint
|
ConnectionPoint 基类定义了一个与消费者或者提供者相关联的对象,并且包含了数据交换所必需的细节。ProviderConnectionPoint 与提供者相关联,而 ConsumerConnectionPoint 则与消费者相关联。
|
ConnectionsZone
|
提供一个 UI 以允许用户在运行时创建服务器控件之间的动态连接。
|
|
请发表评论