按照http://blog.dennus.net/2010/07/20/ribbon-buttons-with-postback-in-sp2010/中所示的示例,而不是在此示例中使用声明性方法,我在OnPreRender事件期间创建了自定义Web部件类和注册的功能区数据扩展,pageComponent脚本等。
一切似乎都运行得很好,我在显示Web部件页面时渲染了我的上下文组/选项卡/控件。但是,如果我在同一页面上添加了两个自定义Web部件,我遇到了错误:ArgumentException:Item已经添加。键入字典:'Ribbon.MyContextualTabGroup'要添加的键:'Ribbon.MyContextualTabGroup']。
我该如何避免这个问题?什么是最好的方法?理想情况下,当选择页面上的不同自定义Web部件时,我希望功能区上下文组/选项卡/控件呈现不同,但我错过了该部件在SharePoint 2010功能区框架中的工作方式。
为了检测页面上的第一个Web部件可能已经注册了上下文组,我尝试了SPRibbon.IsTabAvailable(tabID),但这总是让我回复 - 甚至在我实际添加了标签XML数据扩展之前。我很困惑。注意我没有使用自定义操作/功能部署方法,但动态注册功能区数据扩展和页面组件。
以下是显示我如何添加功能区的代码段:
Microsoft.Web.CommandUI.Ribbon ribbon = SPRibbon.GetCurrent(theWebPart.Page);
if (ribbon != null)
{
// register data extension
XmlDocument ribbonExtensions = new XmlDocument();
ribbonExtensions.LoadXml(ContextualGroupInfo.ToXml());
ribbon.RegisterDataExtension(ribbonExtensions.FirstChild,
"Ribbon.ContextualTabs._children");
// Register initialize function
var manager = new SPRibbonScriptManager();
var methodInfo = typeof(SPRibbonScriptManager).GetMethod(
"RegisterInitializeFunction",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
methodInfo.Invoke(manager, new object[]
{
webPart.Page,
"InitPageComponent",
"/_layouts/PageComponent.js",
false,
"RibbonCustomization.PageComponent.initialize()"
});
var commands = new List();
commands.Add(new SPRibbonCommand(ContextualGroup.EnableContextualGroupCommand));
commands.Add(new SPRibbonCommand(ContextualTab.EnableContextualTabCommand));
...
// add ribbon button commands
...
// initialize tab
ribbon.Minimized = false;
ribbon.CommandUIVisible = true;
if (!ribbon.IsTabAvailable(ContextualTab.ID))
{
ribbon.MakeTabAvailable(ContextualTab.ID);
ribbon.EnableVisibilityContext(ContextualTab.VisibilityContext);
ribbon.MakeContextualGroupInitiallyVisible(ContextualTabGroupID, string.Empty);
ribbon.NormalizeContextualGroup(ContextualTabGroupID, string.Empty);
}
// Make the tab active by default when the page is opened.
ribbon.InitialTabId = ContextualTab.ID;
...
}
答案 0 :(得分:0)
听起来你正在向某个地方的Ribbon系列添加两次TabGroup。请务必使用支票包围您的添加代码,以查看是否已添加标签组。
if (!ribbon.IsTabAvailable(yourid)) {
ribbon.MakeTabAvailable(yourid);
}
这是你的添加代码的样子吗?
答案 1 :(得分:0)
我最终使用自定义Web部件生成具有数据扩展XML的唯一上下文组ID和序列,以避免此错误。但是,当两个Web部件添加到页面时,这会向功能区添加两个上下文组/选项卡。