在FeatureActivated期间更改SearchResultWebPart的XSLT

时间:2011-07-01 12:43:24

标签: search sharepoint-2010 xslt feature-activation

我有一段代码在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更改非常方便

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我觉得你在问题中混淆了一些事情。您想设置 CoreResultsWebPart Xsl 属性。此类没有直接实现 Xsl 方法,因此它继承了其父类( SearchResultBaseWebPart )的实现。 Xsl 属性setter尝试设置 XslHash 属性(但仅当我们在设置_BeforeOnInit = false的OnInit之后),以及的setter方法时XslHash 属性抛出 InvalidOperationException ,但是此异常应该被 Xsl 属性setter中的try / catch块捕获。我在代码中没有看到 InvalidOperationException 的任何其他潜在来源。

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

但首先我建议您在功能接收器代码中添加try / catch块,并trace out添加错误详细信息(如stack trace)并使用DebugView监控结果。