假设创建一个由用户输入员工ID,查询该员工处理订单详情的示例。用户输入界面位于一个WebPart中,显示订单详情的界面位于另一个WebPart中。显然,前者中的WebPart是提供者,后者中的WebPart是订阅者。二者的交互过程是,首先,用户在提供者所在的WebPart中输入员工ID,然后,该值传递给订阅者,最后,订阅者根据获取的ID值,从数据库中获取相关数据并显示在页面上。下面是与实现通信机制有关的五个要点说明,其与WebPart通信机制密切相关。
(1)定义接口
定义接口与通信过程中将要传输的对象有关。如果需要传输的仅仅是简单数值,那么在接口中只要定义一个简单属性即可。如果需要传输的是复杂对象,那么必须根据实际需求,定义接口成员。本示例中,提供者和订阅者之间传递的是整数类型的员工ID,因此,只要定义一个属性EmployeeID即可。下面是定义接口代码。
定义接口代码 |
public interface IEmployeeInfo { int EmployeeID { get; set;} } |
(2)在提供者中实现接口成员
在这一过程中,前提是实现提供者的类,不仅要声明继承自WebPart基类,而且还要声明实现前文定义的接口。在此基础上,才能够实现接口成员。接口只有一个成员EmployeeID,其在提供者类中的实现是很简单的,代码如下所示。
在提供者中实现接口成员代码 |
public class EmployeesWebPart : WebPart, IEmployeeInfo { // 定义初始值 private int _empID = 1; ...... // 实现接口成员EmployeeID public int EmployeeID { get { return _empID; } set { _empID = value; } } } |
(3)在提供者中实现[ConnectionProvider]方法
实现[ConnectionProvider]方法的核心是返回提供者实例,这样订阅者才可能由此获得传递的对象。另外,开发人员还必须在此回传方法上方添加ConnectionProvider特性设置,以此通知WebPartManager控件这里是提供者的连接点。同时,还可设置连接点显示名称DisplayName、连接点标识ID等内容。下面是本例中[ConnectionProvider]方法代码。在代码中已经设置DisplayName和ID都等于EmployeeIDProvider。这些设置与WebPartManager中声明的StaticConnections关联。
实现[ConnectionProvider]方法代码 |
[ConnectionProvider("EmployeeIDProvider", "EmployeeIDProvider")] public IEmployeeInfo ProvideEmployeeInfo() { return this; } |
(4)在订阅者中实现[ConnectionConsumer]方法
[ConnectionConsumer]方法的核心是调用来自提供者的数据对象,并使之与订阅者内部对象发生联系,由此才能更好利用传递的数据。开发人员必须在[ConnectionConsumer]方法上方添加ConnectionConsumer特性,以此告知WebPartManager控件这里是订阅者的连接点。同时,还可设置联结点名称DisplayName、连接点标识ID等内容。下面是本例中[ConnectionConsumer]方法代码。需要注意的是回传方法的声明,其只有一个参数(接口类型),并且返回值为空。同时,设置DisplayName和ID都等于EmployeeIDConsumer。这些设置与WebPartManager中声明的StaticConnections关联。
实现[ConnectionConsumer]方法代码 |
[ConnectionConsumer("EmployeeIDConsumer", "EmployeeIDConsumer")] public void GetEmployeeInfo(IEmployeeInfo empInfo) { if (empInfo != null) { _empID = empInfo.EmployeeID; } else { throw new NotSupportedException("未能连接数据库."); } } |
(5)在WebPartManager控件中声明连接
如果是创建基于静态连接的WebPart通信,那么在WebPartManager中声明连接是必须的。在声明过程中,主要设置的是提供者和订阅者的细节内容。例如,提供者标识ProviderID、提供者连接点ProviderConnectionPointID、订阅者标识ConsumerID、订阅者连接点ConsumerConnectionPointID等。下面是声明连接的代码。
声明连接代码 |
<asp:WebPartManager ID="WebPartManager1" runat="server"> <StaticConnections> <asp:WebPartConnection ID="EmpConnection" ProviderID="EmployeesWebPart1" ProviderConnectionPointID="EmployeeIDProvider" ConsumerID="OrdersWebPart1" ConsumerConnectionPointID="EmployeeIDConsumer" /> </StaticConnections> </asp:WebPartManager> |
如果开发人员创建的是基于动态连接的WebPart通信,则需要在页面中添加ConnectionsZone控件。该控件将能够自动为用户创建自定义连接对象的用户界面。
转自http://www.cnblogs.com/zmsx/archive/2005/12/21/301994.html
POLARIS的回复