我有一段代码在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更改非常方便答案 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监控结果。