假设您有几个webpart,一个作为控制器,另外几个从控制器获取信息并对其进行操作。使用ASP 2.0中引入的Consumer / Producer接口进行建模非常容易。
如何在保持上述情况的同时以相反的方式添加交互?
一个简单的例子是:用户将信息输入到执行搜索的webpart A中,结果将显示在webpart B上.Webpart C允许您过滤应该触发webpart A重新提交查询的结果。因此更新B中的结果。
在WSS 3.0中似乎不可能这样做,因为在任何时候只允许在所有连接中使用1个接口。
这甚至有意义吗? : - )
答案 0 :(得分:2)
启用任意控制通信的快速而肮脏的解决方案是使用递归查找控件和事件。让控件按控件类型搜索控件树以获取所需内容,然后在发布控件上订阅公开公开的事件。
我之前使用过这个技巧来启用标准服务器控件,以便在嵌入不同供应商的CMS系统时找到彼此,以完全避免使用特定的通信API。
答案 1 :(得分:1)
我认为webpart没有任何问题A获得对webpart B的引用并调用公共/内部方法/属性或订阅处理程序来处理公共/内部事件。这样做的一点是:EnsureChildControls。我亲眼目睹了一个webpart对PreRender运行清晰,而另一个webpart甚至没有运行CreateChildControls。
从webpart A中,获取对webpart B的引用(在这种情况下,webpart B的类型为Calendar),如下所示:
private Calendar _calendarWP = null;
public Calendar CalendarWP
{
get
{
if (_calendarWP != null)
return _calendarWP;
else
foreach (System.Web.UI.WebControls.WebParts.WebPartZone zone in this.WebPartManager.Zones)
foreach (System.Web.UI.WebControls.WebParts.WebPart webpart in zone.WebParts)
if (webpart is Calendar)
{
_calendarWP = (Calendar)webpart;
_calendarWP.EnsureChildControls();
return _calendarWP;
}
return null;
}
}
现在你可以做一些事情,比如获取一些新数据并像这样更新日历:
IEnumerable newData = SomeDataProvider.GetNewData(args);
CalendarWP.someGridView.DataSource = newData;
CalendarWP.someGridView.DataBind();
或者让webpart A将自己的引用转移到webpart B上,这样它就可以使用webpart A的公共/内部属性为自己获取数据:
CalendarWP.UseWPAToFetchData(this);