【问题标题】:Problem with custom web part adding contextual ribbon tab自定义 Web 部件添加上下文功能区选项卡的问题
【发布时间】:2011-01-27 04:20:37
【问题描述】:

按照http://blog.dennus.net/2010/07/20/ribbon-buttons-with-postback-in-sp2010/ 中的示例进行操作,而不是在此示例中使用声明式方法,我在 OnPreRender 事件期间创建了自定义 Web 部件类并注册了功能区数据扩展、pageComponent 脚本等。

一切似乎都运行良好,当显示 Web 部件页面时,我得到了我的上下文组/选项卡/控件。但是,如果我在同一页面上添加两个自定义 Web 部件,则会遇到错误:ArgumentException: Item has been added。字典中的键:'Ribbon.MyContextualTabGroup' 正在添加的键:'Ribbon.MyContextualTabGroup']。

如何避免这个问题?最好的方法是什么? Ideally I would like the ribbon contextual group/tab/control render differently when different custom web part on the page is selected but I missed how that part works in SharePoint 2010 Ribbon framework.

为了检测页面上的第一个 Web 部件可能已经注册了上下文组,我尝试了 SPRibbon.IsTabAvailable(tabID) 但这总是返回 true - 甚至在我实际添加选项卡 XML 数据扩展之前。我很困惑。注意我没有使用自定义操作/功能部署方法,而是动态注册功能区数据扩展和页面组件。

下面的代码 sn-p 显示了我是如何添加功能区的:



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;
   ...
}

【问题讨论】:

  • 你能添加错误的完整堆栈跟踪吗,它是从哪里抛出的
  • 这里是简短的堆栈跟踪:[ArgumentException: Item has been added。字典中的键:'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 writer) +1394 Microsoft.SharePoint.WebControls.SPRibbon.Render(HtmlTextWriter writer) ... System.Web.UI .Page.Render(HtmlTextWriter writer) 它使 SharePoint 页面崩溃。

标签: sharepoint ribbon


【解决方案1】:

听起来您在某处的功能区集合中添加了两次 TabGroup。始终让您的添加代码被一个检查包围,以查看选项卡组是否已添加。

if (!ribbon.IsTabAvailable(yourid)) {
    ribbon.MakeTabAvailable(yourid);
}

你的添加代码是这样的吗?

【讨论】:

  • 请看我添加的代码sn-p。当我在页面上有两个或更多自定义 Web 部件时会发生错误。
【解决方案2】:

我最终会使用自定义 Web 部件的数据扩展 XML 生成唯一的上下文组 ID 和序列,以避免此错误。但是,当将两个 Web 部件添加到页面时,这会在功能区中添加两个上下文组/选项卡。

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多