关于Web Part 通讯

    以创建一个由用户实体为例,输入员工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("EmployeeIDProvider", "EmployeeIDProvider")]
public IEmployeeInfo ProvideEmployeeInfo()
{
    return this;
}

(4)在订阅者中实现[ConnectionConsumer]方法

[ConnectionConsumer]方法的核心是调用来自提供者的数据对象,并使之与订阅者内部对象发生联系,由此才能更好利用传递的数据。开发人员必须在[ConnectionConsumer]方法上方添加ConnectionConsumer特性,以此告知WebPartManager控件这里是订阅者的连接点。同时,还可设置联结点名称DisplayName、连接点标识ID等内容。下面是本例中[ConnectionConsumer]方法代码。需要注意的是回传方法的声明,其只有一个参数(接口类型),并且返回值为空。同时,设置DisplayName和ID都等于EmployeeIDConsumer。这些设置与WebPartManager中声明的StaticConnections关联。

[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控件。该控件将能够自动为用户创建自定义连接对象的用户界面。

原文地址:https://www.cnblogs.com/masahiro/p/10129177.html