Развернуть две подключенные веб-части в макете страницы во время активации функции? - PullRequest
1 голос
/ 01 марта 2011

Я реализовал 2 веб-части (производные от Microsoft.SharePoint.WebPartPages.WebPart, веб-части WSS 3), одна из которых является поставщиком, а другая - потребителем (реализующая модель подключения ASP.net, с ConnectionProviderAttribute и ConnectionConsumerAttribute методы).

Мне удалось развернуть их в функции, которая также развертывает макет страницы, содержащий две зоны веб-частей, которые сами заполняются во время метода FeatureAvtivation компонентаполучатель, с 2 вновь созданными веб-частями.Все это прекрасно работает.

Для информации я использовал эту ссылку , чтобы она работала.Осторожно, метод, использующий тег AllUsersWebPart в elements.xml , показанный в ссылках, подобных этой (http://www.andrewconnell.com/blog/archive/2007/10/07/Having-Default-Web-Parts-in-new-Pages-Based-Off-Page.aspx), работает, но если вы деактивируете, а затем снова активируйте свою функцию, у вас просто будетвеб-частей в ваших будущих страницах на основе макета. Описанный здесь метод (http://sharepoint.coultress.com/2008/06/adding-web-part-to-page-layout.html) просто выдал ошибку при анализе метаданных для файла ASPX макета (похоже, проблема возникла из строки в теге ZoneTemplate).

Моя следующая цель - сразу после всего этого соединить эти веб-части, что позволит конечному пользователю создавать страницы на основе макета, содержащего по умолчанию две веб-части , соединенные вместе(сейчас все работает, кроме подключенной части).

Я пробовал что-то вроде this , используя модель подключения ASP.net (другая, модель WSS,логически выдает ошибку, потому что я не реализую хорошие интерфейсы). Но даже если соединение, полученное в результате "mgr.SPConnectWebParts ()" метod не выдает никаких исключений и фактически добавляет соединение в список соединений менеджера веб-частей. В режиме отладки я вижу, что свойство соединения IsActive является ложным (может быть нормальным), и что при создании новой страницы на основена макете веб-части не подключены.

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

Ответы [ 3 ]

2 голосов
/ 04 июля 2012

Декларативная подготовка подключения к веб-части на самом деле довольно проста:

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="Module1">
    <File Path="Module1\default.aspx" Url="demo.aspx">
      <AllUsersWebPart ID="testProvider">...</AllUsersWebPart>
      <AllUsersWebPart ID="testConsumer">...</AllUsersWebPart>
      <WebPartConnection ID="testConnection"
                         ProviderID="testProvider"
                         ProviderConnectionPointID="providerID"
                         ConsumerID="testConsumer"
                         ConsumerConnectionPointID="consumerID" />
     </File>
  </Module>
</Elements>

Подробности: http://blogs.code -counsel.net / Wouter / Lists / Posts / Post.aspx? ID = 161

Вы можете найти идентификаторы точек подключения с помощью PowerShell, если впервые подключите свои веб-части вручную:

$web = Get-SPWeb <WebURL>
$wpman = $web.GetLimitedWebPartManager("<PageURL>", [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
$wpman.SPWebPartConnections
0 голосов
/ 21 марта 2011

Наконец, я использовал другой подход для достижения своей цели. В событии OnLoad веб-части провайдера я проверяю, находится ли моя страница в режиме редактирования / нового, а затем проверяет, содержит ли страница веб-часть потребителя (через веб-администратор) и не подключены ли они. Если это так, я подключаю их.

Код для постоянного подключения веб-частей:

private void SetUpConnections()
{
    SPSecurity.RunWithElevatedPrivileges(delegate() {
        using (SPSite siteContext = new SPSite(SPContext.Current.Site.ID))
        using (SPWeb webContext = siteContext.OpenWeb(siteContext.ServerRelativeUrl))
        using (SPLimitedWebPartManager spManager = webContext.GetFile(SPContext.Current.File.Url).GetLimitedWebPartManager(PersonalizationScope.Shared))
        {
            foreach (Microsoft.SharePoint.WebPartPages.WebPart consumer in spManager.WebParts)
            {
                if (consumer is MyConsumerWebPart)
                {
                    bool alreadyConnected = false;
                    Microsoft.SharePoint.WebPartPages.WebPart provider = spManager.WebParts[this.ID] as Microsoft.SharePoint.WebPartPages.WebPart;
                    foreach (SPWebPartConnection connection in spManager.SPWebPartConnections)
                    {
                        if (connection.Provider == provider && connection.Consumer == consumer) { alreadyConnected = true; break; }
                    }
                    if (!alreadyConnected)
                    {
                        // Connects webparts permanently (but the page would need a reload to display the connection)
                        ProviderConnectionPoint providerConnectionPoint = spManager.GetProviderConnectionPoints(provider)["MyConnectionProviderInterfaceId"];
                        ConsumerConnectionPoint consumerConnectionPoint = spManager.GetConsumerConnectionPoints(consumer)["MyConnectionConsumerInterfaceId"];
                        spManager.SPConnectWebParts(provider, providerConnectionPoint, consumer, consumerConnectionPoint);

                        // Connects webparts locally (for current edit mode)
                        SPWebPartManager currentSPManager = WebPartManager.GetCurrentWebPartManager(this.Page) as SPWebPartManager;
                        System.Web.UI.WebControls.WebParts.WebPart currentProvider = this;
                        System.Web.UI.WebControls.WebParts.WebPart currentConsumer = currentSPManager.WebParts[consumer.ID];
                        ProviderConnectionPoint currentProviderConnectionPoint = currentSPManager.GetProviderConnectionPoints(currentProvider)["SearchBarProvider"];
                        ConsumerConnectionPoint currentConsumerConnectionPoint = currentSPManager.GetConsumerConnectionPoints(currentConsumer)["SearchBarConsumer"];
                        currentSPManager.SPConnectWebParts(currentProvider, currentProviderConnectionPoint, currentConsumer, currentConsumerConnectionPoint);
                    }
                }
            }
        }
    });
}

Код для проверки, находится ли страница в новом режиме / режиме редактирования:

if (SPContext.Current.FormContext.FormMode == SPControlMode.New
    || SPContext.Current.FormContext.FormMode == SPControlMode.Edit)
{
    this.SetUpConnections();
}
0 голосов
/ 01 марта 2011

Пробовали создавать веб-части на странице программно? У вас будет гораздо меньше головных болей, чем если вы попытаетесь сделать это декларативно.

Посмотрите класс SPLimitedWebPartManager, чтобы узнать, как обрабатывать веб-части на подготовленной странице.

Кроме того, веб-части в зоне веб-частей связаны с URL-адресом страницы, на которой они добавляются. Это устройство диспетчера веб-частей ASP.NET.

Таким образом, если вы добавили веб-части в зоны на макете страницы в каталоге: http://webapp/sites/site/_catalog/master/mypagelayout.aspx - веб-части появятся ТОЛЬКО на этой странице. Создайте новую страницу по адресу /sites/site/Pages/MyPage.aspx, и веб-части, которые вы добавили ранее, не будут отображаться. Обходной путь для этого заключается в явном добавлении веб-частей, не входящих в зоны веб-частей, и это можно сделать только в авторском макете страницы (обычно в SharePoint Designer).

Если веб-части статичны в макете страницы (и вы хотите, чтобы они отображались на каждой странице), то на самом деле это проще для развертывания - просто сохраните макет в исходном коде и предоставьте его с помощью элемента Module .

...