按照http://blog.dennus.net/2010/07/20/ribbon-buttons-with-postback-in-sp2010/所示,而不是在該示例中使用聲明性的方法的例子中,我的OnPreRender事件期間創建的自定義web部件類和註冊色帶數據擴展,pageComponent腳本等。問題的自定義web部分添加上下文功能區選項卡
一切似乎工作得很好,我得到了當顯示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;
...
}
你可以添加錯誤的完整堆棧跟蹤,它從 – djeeg 2011-01-22 05:35:24
拋出的位置這裏是短堆棧跟蹤: [ArgumentException:Item已被添加。鍵入字典:'Ribbon.QuestContextualTabGroup' 正在添加的鍵:'Ribbon.QuestContextualTabGroup'] System.Collections.Hashtable.Insert(Object key,Object nvalue,Boolean add) Microsoft.Web.CommandUI.RibbonRenderer.RenderRibbon(。 ..) Microsoft.Web.CommandUI.Ribbon.AppendRibbon(...) Microsoft.Web.CommandUI.Ribbon.Render(HtmlTextWriter的作家)1394 Microsoft.SharePoint.WebControls.SPRibbon.Render(HtmlTextWriter的作家) 。 .. System.Web.UI.Page.Render(HtmlTextWriter作家) 它崩潰了SharePoint頁面。 – sean 2011-01-22 21:33:09