2008-10-01 2 views
5

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

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

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

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

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

ответ

2

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

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

+0

это немного противно: D – 2008-10-01 19:48:01

1

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

С веб-части А, принеси вашу ссылку на WebPart B (в этом случае веб-части 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 жеребьевку ссылку на себя к WebPart B, поэтому он может использовать WebPart общественных/внутренних свойств а, чтобы пойти получить данные для себя:

CalendarWP.UseWPAToFetchData(this); 
Смежные вопросы