5

假设您有几个 webpart,一个作为控制器,还有几个从控制器获取信息并对其进行操作。使用 ASP 2.0 中引入的消费者/生产者接口来建模是相当容易的。

您如何能够以相反的方式添加交互,同时仍然保持上述内容?

一个简单的例子是:用户在执行搜索的 webpart A 中输入信息,结果将显示在 webpart B 上。Webpart C 允许您过滤应该触发 webpart A 重新提交查询的结果,从而更新结果为 B。

在 WSS 3.0 中似乎无法做到这一点,因为在任何时候都只允许在所有连接中使用 1 个接口。

这甚至有意义吗?:-)

4

2 回答 2

2

启用任意控制通信的快速而肮脏的解决方案是使用递归查找控制和事件。让控件按控件类型在控件树中搜索所需内容,然后订阅发布控件上公开的事件。

我以前曾使用该技巧使标准服务器控件在嵌入到来自不同供应商的 CMS 系统中时能够相互查找,从而完全避免使用特定的通信 API。

于 2008-10-01T13:51:02.157 回答
1

我认为 webpart A 获取对 webpart B 的引用并调用公共/内部方法/属性或为公共/内部事件订阅处理程序没有任何问题。这样做时要提一点:EnsureChildControls。我亲眼目睹了一个 webpart 对 PreRender 运行清晰,而另一个 webpart 甚至没有运行 CreateChildControls。

从 webpart A,获取您对 webpart B 的引用(在这种情况下,webpart B 是日历类型),如下所示:

     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);
于 2008-10-01T21:00:27.910 回答