#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 конкретной страницы просмотра.
Дополнительные примеры можно найти здесь: