Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)

上一篇介绍了Web Parts基础,如果两个Web Part之间不能通讯,那就相当郁闷的,所以Asp.Net提供了两种方式来使得Web Part之间可以互相通讯,一种是静态通讯方式,另一种时使用ConnectionZone进行动态通讯。(这里所谓的“Web Part通讯”是指多个WebPart中用户控件之间的通讯)。下面是Web Parts直接进行通讯的模型:
Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)


    我在学习过程中,通过实例--根据我的Blog的RSS来搜索文章--来演示Web Part之间的静态通讯。运行结果如下所示(没有进行界面美化^_^):
起始页面:
Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)

    以"struct"作为关键字搜索的结果页面:
Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)


    页面中放了两个Web Part,第一个WebPart中包含一个由文本框和按钮组成的用户控件Search(这里用的是用户控件,而不是直接在WebPart放置文本框和按钮,如果直接放的话每个控件都有个标题条TitleBar,感觉太别扭);第二个WebPart中负责显示搜索结果,也是包含一个用户控件Content,Content控件包含0个或多个动态添加的Label。下面是设计Web Parts间进行通讯的步骤:

1. 创建消息接口:定义一个IMessage接口

1Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)public interface IKeyWord
2Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码){
3Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码) string Messageget;}
4Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)}

 

2. 通讯提供者(Provider):
     这个示例中,第一个WebPart中的用户控件Search作为通讯提供者,因此我们定义Search控件的代码如下:

 1Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)public partial class Search : System.Web.UI.UserControl,IKeyWord//继承通讯接口IKeyWord
 2Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码){
 3Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    protected void Page_Load(object sender, EventArgs e)
 4Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    {
 5Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    }

 6Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
 7Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    /*通讯提供者,实现方法返回消息接口,并且方法上要运用特性[ConnectionProvider],第二个参数用作在WebPartManager中注册*/
 8Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    [ConnectionProvider("KeyWord""KeyWordProvider")]
 9Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    public IKeyWord KeyWordProvide()
10Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    {
11Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        return this;
12Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    }

13Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
14Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    IKeyWord 成员
20Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)}

21Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
22Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)




3. 通讯订阅者(Consumer):
     这个示例中,第而个WebPart中的用户控件Content作为消息订阅者,因此我们定义该控件的代码如下:

 1Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)public partial class Content : System.Web.UI.UserControl
 2Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码){    
 3Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    protected void Page_Load(object sender, EventArgs e)
 4Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    {
 5Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    }

 6Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
 7Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    [ConnectionConsumer("KeyWord","KeywordConsumer")]
 8Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    public void GetKeyWord(IKeyWord keyword)
 9Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    {
10Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        ProcessRSSItem(keyword.Message);
11Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    }

12Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
13Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    //解析RSS,并显示解析结果
14Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    public void ProcessRSSItem(string keyword)
15Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    {
16Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        System.Xml.XmlDocument rssDoc = new System.Xml.XmlDocument();
17Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        rssDoc.Load(Server.MapPath("source.xml"));
18Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        System.Xml.XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item");
19Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
20Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        string title = "";
21Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        string link = "";
22Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        string description = "";
23Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
24Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        for (int i = 0; i < rssItems.Count; i++)
25Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        {
26Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            System.Xml.XmlNode rssDetail;
27Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
28Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            //读取标题
29Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            rssDetail = rssItems.Item(i).SelectSingleNode("title");
30Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            if (rssDetail != null)
31Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)                title = rssDetail.InnerText;
32Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            else
33Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)                title = "";
34Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
35Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            //如果不包括keyword关键字,则跳转到下一条记录
36Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            if (!String.IsNullOrEmpty(keyword) && (title.IndexOf(keyword) == -1))
37Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)                continue;
38Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
39Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            //读取URL
40Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            rssDetail = rssItems.Item(i).SelectSingleNode("link");
41Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            if (rssDetail != null)
42Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)                link = rssDetail.InnerText;
43Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            else
44Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)                link = "";
45Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
46Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            //读取描述信息
47Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            rssDetail = rssItems.Item(i).SelectSingleNode("description");
48Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            if (rssDetail != null)
49Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)                description = rssDetail.InnerText;
50Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            else
51Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)                description = "";
52Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
53Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            //输出            
54Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            Label label = new Label();
55Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            label.Text = "<p><b><a href='" + link + "' target='new'>" + title + "</a></b><br/>" + description + "</p>";
56Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)            this.Controls.Add(label);
57Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)        }

58Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)    }

59Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)}

60Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)
61Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)



4. 在页面*.aspx的WebPartManager中注册提供者和订阅者:

1Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)<asp:WebPartManager ID="wpManager" runat="server">
2Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)     <StaticConnections>
3Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)         <asp:WebPartConnection ID="KeywordConnection"
4Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)             ProviderID="search" ProviderConnectionPointID="KeyWordProvider"
5Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)             ConsumerID="content" ConsumerConnectionPointID="KeywordConsumer">
6Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)         </asp:WebPartConnection>
7Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)     </StaticConnections>
8Asp.net2.0 - WebParts学习笔记(2):WebPart 之间进行静态通讯的完整示例(附源码)</asp:WebPartManager>

 


附:完整源码下载http://files.cnblogs.com/happyhippy/WebPartDemo.rar

本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2007/04/14/713136.html,如需转载请自行联系原作者
上一篇:苹果不再奢侈,甩卖策略能拯救疲软的销量吗?


下一篇:上市在即估值超百亿美元,为何Pinterest的中国跟随者起不来?