Sharepoint WebParts - PullRequest
       26

Sharepoint WebParts

5 голосов
/ 01 октября 2008

Скажем, у вас есть несколько веб-частей, одна в качестве контроллера и несколько, которые берут информацию из контроллера и действуют на нее. Это довольно легко смоделировать с помощью интерфейса Consumer / Producer, представленного в ASP 2.0.

Как бы вы могли добавлять взаимодействия наоборот, при этом сохраняя вышесказанное?

Простой пример: пользователь вводит информацию в веб-часть A, которая выполняет поиск, и результаты будут отображаться в веб-части B. Веб-часть C позволяет фильтровать результаты, которые должны инициировать веб-часть A для повторной отправки запроса и следовательно обновите результаты в B.

В WSS 3.0 это не представляется возможным, поскольку вам разрешено использовать только один интерфейс во всех соединениях одновременно.

Имеет ли это смысл? : -)

Ответы [ 2 ]

2 голосов
/ 01 октября 2008

Быстрое и грязное решение для обеспечения произвольной связи управления заключается в использовании рекурсивного управления поиском и событиями. Попросите элементы управления выполнить поиск дерева элементов управления по типу элемента управления, а затем подписаться на общедоступные события в элементе управления публикацией.

Ранее я использовал эту хитрость, чтобы стандартные серверные элементы управления могли находить друг друга, когда они встроены в системы CMS разных производителей, чтобы полностью исключить конкретный API связи.

1 голос
/ 02 октября 2008

Я не вижу ничего плохого в том, что веб-часть A получает ссылку на веб-часть B и вызывает публичные / внутренние методы / свойства или подписывает обработчики на публичные / внутренние события. При этом следует упомянуть один момент: EnsureChildControls. Я видел своими глазами, как одна веб-часть была запущена PreRender, в то время как другая веб-часть даже не запускала CreateChildControls.

Из веб-части A извлеките ссылку на веб-часть B (в данном случае веб-часть 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();

Или, возможно, разрешить веб-части A передавать ссылку на себя веб-части B, чтобы она могла использовать открытые / внутренние свойства веб-части A для извлечения данных для себя:

CalendarWP.UseWPAToFetchData(this);
...