上一篇介绍了Web Parts基础,如果两个Web Part之间不能通讯,那就相当郁闷的,所以Asp.Net提供了两种方式来使得Web Part之间可以互相通讯,一种是静态通讯方式,另一种时使用ConnectionZone进行动态通讯。(这里所谓的“Web Part通讯”是指多个WebPart中用户控件之间的通讯)。下面是Web Parts直接进行通讯的模型:
我在学习过程中,通过实例--根据我的Blog的RSS来搜索文章--来演示Web Part之间的静态通讯。运行结果如下所示(没有进行界面美化^_^):
起始页面:
以"struct"作为关键字搜索的结果页面:
页面中放了两个Web Part,第一个WebPart中包含一个由文本框和按钮组成的用户控件Search(这里用的是用户控件,而不是直接在WebPart放置文本框和按钮,如果直接放的话每个控件都有个标题条TitleBar,感觉太别扭);第二个WebPart中负责显示搜索结果,也是包含一个用户控件Content,Content控件包含0个或多个动态添加的Label。下面是设计Web Parts间进行通讯的步骤:
1. 创建消息接口:定义一个IMessage接口
2 {
3 string Message{ get;}
4}
2. 通讯提供者(Provider):
这个示例中,第一个WebPart中的用户控件Search作为通讯提供者,因此我们定义Search控件的代码如下:
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 }
6
7 /*通讯提供者,实现方法返回消息接口,并且方法上要运用特性[ConnectionProvider],第二个参数用作在WebPartManager中注册*/
8 [ConnectionProvider("KeyWord", "KeyWordProvider")]
9 public IKeyWord KeyWordProvide()
10 {
11 return this;
12 }
13
14 IKeyWord 成员
20}
21
22
3. 通讯订阅者(Consumer):
这个示例中,第而个WebPart中的用户控件Content作为消息订阅者,因此我们定义该控件的代码如下:
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 }
6
7 [ConnectionConsumer("KeyWord","KeywordConsumer")]
8 public void GetKeyWord(IKeyWord keyword)
9 {
10 ProcessRSSItem(keyword.Message);
11 }
12
13 //解析RSS,并显示解析结果
14 public void ProcessRSSItem(string keyword)
15 {
16 System.Xml.XmlDocument rssDoc = new System.Xml.XmlDocument();
17 rssDoc.Load(Server.MapPath("source.xml"));
18 System.Xml.XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item");
19
20 string title = "";
21 string link = "";
22 string description = "";
23
24 for (int i = 0; i < rssItems.Count; i++)
25 {
26 System.Xml.XmlNode rssDetail;
27
28 //读取标题
29 rssDetail = rssItems.Item(i).SelectSingleNode("title");
30 if (rssDetail != null)
31 title = rssDetail.InnerText;
32 else
33 title = "";
34
35 //如果不包括keyword关键字,则跳转到下一条记录
36 if (!String.IsNullOrEmpty(keyword) && (title.IndexOf(keyword) == -1))
37 continue;
38
39 //读取URL
40 rssDetail = rssItems.Item(i).SelectSingleNode("link");
41 if (rssDetail != null)
42 link = rssDetail.InnerText;
43 else
44 link = "";
45
46 //读取描述信息
47 rssDetail = rssItems.Item(i).SelectSingleNode("description");
48 if (rssDetail != null)
49 description = rssDetail.InnerText;
50 else
51 description = "";
52
53 //输出
54 Label label = new Label();
55 label.Text = "<p><b><a href='" + link + "' target='new'>" + title + "</a></b><br/>" + description + "</p>";
56 this.Controls.Add(label);
57 }
58 }
59}
60
61
4. 在页面*.aspx的WebPartManager中注册提供者和订阅者:
2 < StaticConnections >
3 < asp:WebPartConnection ID = " KeywordConnection "
4 ProviderID = " search " ProviderConnectionPointID = " KeyWordProvider "
5 ConsumerID = " content " ConsumerConnectionPointID = " KeywordConsumer " >
6 </ asp:WebPartConnection >
7 </ StaticConnections >
8 </ asp:WebPartManager >
附:完整源码下载http://files.cnblogs.com/happyhippy/WebPartDemo.rar