Как автоматически включить подключения к веб-части при создании страницы публикации на основе пользовательского макета страницы в SharePoint 2010

#sharepoint-2010 #publishing #page-layout

#sharepoint-2010 #публикация #макет страницы

Вопрос:

Я создал простой пользовательский макет страницы в SharePoint Designer, добавил пару зон веб-части и пользовательскую веб-часть в каждой зоне.

Эти веб-части имеют пользовательский набор интерфейсов поставщик-потребитель. Я настроил соединение между веб-частями в SharePoint Designer (используя мастер добавления подключения) и сохранил макет страницы.

После этого я проверил макет и утвердил его в веб-интерфейсе SP.

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

Это ожидаемое поведение? Если да, есть ли способ настроить подключение автоматически программно или декларативно?

Есть ли какой-то шаг, который я пропускаю?

Ответ №1:

Установить подключения в SharePoint можно, но не так просто. Ниже приведен код из моего проекта. Сначала нам нужен какой-либо метод для создания поля transformer для потребителей и поля provider:

 private TransformableFilterValuesToParametersTransformer CreateTransformer(String consumerFieldName, String providerFieldName)
        {
            TransformableFilterValuesToParametersTransformer filterToParameterTransformer =
                new TransformableFilterValuesToParametersTransformer();
            // The private fields '_consumerFieldNames' and '_providerFieldNames' must be set for the web part connection to work.
            // Having reflected the TransformableFilterValuesToParametersTransformer it seems that the only place this is set is within a
            // nested wizard class (this seems to be the wizard that runs when the connection is created via the SharePoint UI) so although
            // this is not pretty it looks to be the only way...

            try
            {
                string[] _consumerFieldNames = new string[1];
                _consumerFieldNames[0] = consumerFieldName;
                FieldInfo conFld = typeof(TransformableFilterValuesToParametersTransformer).GetField("_consumerFieldNames", BindingFlags.Instance | BindingFlags.NonPublic);
                conFld.SetValue(filterToParameterTransformer, _consumerFieldNames);
                string[] _providerFieldNames = new string[1];
                _providerFieldNames[0] = providerFieldName;
                FieldInfo prvFld = typeof(TransformableFilterValuesToParametersTransformer).GetField("_providerFieldNames", BindingFlags.Instance | BindingFlags.NonPublic);
                prvFld.SetValue(filterToParameterTransformer, _providerFieldNames);
            }
            catch
            {
                throw new Exception("Unexpected internal definition for 'TransformableFilterValuesToParametersTransformer'. Please amend private member access code.");
            }
            return filterToParameterTransformer;
        }
  

Теперь создайте подключение:

 TransformableFilterValuesToParametersTransformer transformer = CreateTransformer("ConsumerFieldInternalName", "ProviderFieldInternalName");

            ProviderConnectionPointCollection pcpc = mgr.GetProviderConnectionPoints(providerWebPart);
            ConsumerConnectionPointCollection ccpc = mgr.GetConsumerConnectionPoints(consumerWebPart);
            mgr.SPConnectWebParts(
               providerWebPart, pcpc[0],
                consumerWebPart,
                ccpc[0],
                transformer
                );
  

mgr — это экземпляр SPLimitedWebPartManager конкретной страницы просмотра.

Дополнительные примеры можно найти здесь:

http://social.msdn.microsoft.com/Forums/en/sharepointdevelopment/thread/3f960d66-af45-42ca-82d7-114de773213f

http://jsiegmund.wordpress.com/2010/05/28/sp2010-programmatically-creating-a-web-part-page-with-connected-webparts/