0

我有一段代码可以更改 Sharepoint 2010 搜索中心结果页面上 SearchResultWebPart 的 XSLT(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 中有一段代码,它检查 webpart 是否没有初始化——它在设置 XSL 属性时抛出了上面提到的异常。有人知道如何解决这个问题吗?对我来说,在 FeatureActivated 进行 XSL 更改会非常方便......

4

2 回答 2

1

我找到了解决问题的方法,但它使用不同的方式为 SearchResultBaseWebPart 设置 xsl。

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);
于 2011-07-06T09:32:21.493 回答
0

我觉得你在问题中混淆了一些东西。您想设置CoreResultsWebPart的Xsl属性。该类没有直接实现Xsl方法,因此它继承了其父类 ( SearchResultBaseWebPart ) 的实现。Xsl属性设置器尝试设置XslHash属性(但前提是我们在设置 _BeforeOnInit = false; 的 OnInit 之后),并且 XslHash 属性的设置器方法抛出InvalidOperationException但是这个异常应该被 try/catch 捕获无论如何都在 Xsl属性设置器中阻止。我没有看到任何其他潜在的来源代码中的InvalidOperationException

您应该检查您的 SP2010 的补丁级别(它是 SP1/一些累积更新/原始版本吗?)并尝试从不同的上下文(从网站/STSADM 或 PowerShell)激活该功能。

但首先我建议您在功能接收器代码中添加一个 try/catch 块并跟踪错误详细信息(如堆栈跟踪)并使用DebugView监视结果。

于 2011-07-01T15:10:57.047 回答