Изменить XSLT SearchResultWebPart во время FeatureAcactive

У меня есть фрагмент кода, который изменяет XSLT SearchResultWebPart на странице результатов Центра поиска Sharepoint 2010 (spFileItem - это SPFile страницы результатов поиска):

SPLimitedWebPartManager wpManager = spFileItem.GetLimitedWebPartManager(PersonalizationScope.Shared);
foreach (WebPart wpItem in wpManager.WebParts)
{
    if (wpItem is CoreResultsWebPart)
    {
      ((CoreResultsWebPart)wpItem).UseLocationVisualization = false;
      ((CoreResultsWebPart)wpItem).Xsl = someXSL;
      wpManager.SaveChanges(wpItem);
}
spFileItem.Update();
spFileItem.CheckIn(Consts.CheckInComment, SPCheckinType.MajorCheckIn);

Но этот код не работает, если он вызывается при активированной функции (дает InvalidOperationException - неправильное состояние объекта). Однако это прекрасно работает в консольном приложении. Поразмыслив, я обнаружил, что внутри SearchResultWebPart есть фрагмент кода, который проверяет, не была ли инициализирована веб-часть, и выдает указанное выше исключение при настройке свойства XSL. Кто-нибудь знает, как решить эту проблему? Для меня было бы очень удобно сделать XSL-изменение в FeatureActivation...

2 ответа

Решение

Я нашел решение моей проблемы, но он использует другой способ установки xsl для SearchResultBaseWebPart.

SPLimitedWebPartManager wpManager = spFileItem.GetLimitedWebPartManager(PersonalizationScope.Shared);
foreach (WebPart wpItem in wpManager.WebParts)
{
    if (wpItem is CoreResultsWebPart)
    {
      ((CoreResultsWebPart)wpItem).UseLocationVisualization = false;
      ((CoreResultsWebPart)wpItem).XslLink = spFileItem.Web.Url + @"/_layouts/XSL/MYXSL.xsl";
      wpManager.SaveChanges(wpItem);
    }
}
spFileItem.Update();
spFileItem.CheckIn(Consts.CheckInComment, SPCheckinType.MajorCheckIn);

Я чувствую, что вы перепутали несколько вещей в вопросе. Вы хотите установить свойство Xsl в CoreResultsWebPart. Этот класс не имеет прямой реализации метода Xsl, поэтому он наследует реализацию своего родительского класса (SearchResultBaseWebPart). Установщик свойства Xsl пытается установить свойство XslHash (но только если мы находимся после OnInit, который устанавливает _BeforeOnInit = false;), а метод setter свойства XslHash создает исключение InvalidOperationException, но это исключение должно быть перехвачено try/catch Блок в XSL свойство setter в любом случае. Я не вижу никакого другого потенциального источника InvalidOperationException в коде.

Вам следует проверить уровень исправления вашего SP2010 (это SP1/ некоторые накопительные обновления / оригинальная версия?) И попытаться активировать функцию в разных контекстах (с веб-сайта / STSADM или PowerShell).

Но сначала я предлагаю вам добавить блок try/catch в код получателя функций, отследить детали ошибок (например , трассировку стека) и отслеживать результаты с помощью DebugView.

Другие вопросы по тегам