Несколько веб-частей и ленты в SharePoint

Я связываю ленту со своей веб-частью. Мне нужно добавить более двух веб-частей на страницу.

Я не хочу иметь отдельную контекстную группу / вкладку для каждой веб-части. Есть ли способ проверить, существует ли определенная группа / вкладка на текущей ленте на странице?

На этом этапе, когда я добавляю на страницу более одной веб-части, я получаю следующую ошибку:

Item has already been added. Key in dictionary: 'Ribbon.MyContextualTabGroup' Key being added: 'Ribbon.MyContextualTabGroup'

Вот мой код для справки:

/// <summary>
/// Gets the web part contextual info.
/// </summary>
public WebPartContextualInfo WebPartContextualInfo
{
    get
    {
        var webPartContextualInfo = new WebPartContextualInfo();
        var webPartRibbonContextualGroup = new WebPartRibbonContextualGroup();
        var webPartRibbonTab = new WebPartRibbonTab();

        webPartRibbonContextualGroup.Id = "Ribbon.MyContextualTabGroup";
        webPartRibbonContextualGroup.Command = "MyContextualTab.EnableContextualGroup";
        webPartRibbonContextualGroup.VisibilityContext = "MyContextualTab.CustomVisibilityContext";

        webPartRibbonTab.Id = "Ribbon.MyTab";
        webPartRibbonTab.VisibilityContext = "MyContextualTab.CustomVisibilityContext";

        webPartContextualInfo.ContextualGroups.Add(webPartRibbonContextualGroup);
        webPartContextualInfo.Tabs.Add(webPartRibbonTab);
        webPartContextualInfo.PageComponentId = SPRibbon.GetWebPartPageComponentId(this);

        return webPartContextualInfo;
    }
}

/// <summary>
/// Adds the contextual tab.
/// </summary>
private void AddContextualTab()
{
    SPRibbon spRibbon = SPRibbon.GetCurrent(Page);

    if (spRibbon == null) return;

    var ribbonExtensions = new XmlDocument();

    ribbonExtensions.LoadXml(_contextualTab);
    spRibbon.RegisterDataExtension(ribbonExtensions.FirstChild, "Ribbon.ContextualTabs._children");

    ribbonExtensions.LoadXml(_contextualTabTemplate);
    spRibbon.RegisterDataExtension(ribbonExtensions.FirstChild, "Ribbon.Templates._children");
}

/// <summary>
/// The event handler for the System.Web.UI.Control.PreRender event that occurs immediately before the Web Part is rendered to the Web Part Page it is contained on.
/// </summary>
/// <param name="e">A System.EventArgs that contains the event data.</param>
protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);

    AddContextualTab();

    ClientScriptManager clientScriptManager = Page.ClientScript;
    clientScriptManager.RegisterClientScriptBlock(GetType(), "MyWebPart", DelayScript);
}

person Moon    schedule 16.06.2011    source источник


Ответы (1)


Контекстные ленты нельзя использовать в разных экземплярах веб-части. Поскольку лента будет отображаться только в том случае, если ваш экземпляр веб-части находится в «фокусе» на странице. Поэтому несколько экземпляров веб-части должны создать свою собственную контекстную группу.

Чтобы избежать дублирования идентификатора ленты, добавьте к идентификаторам ленты часть, относящуюся к экземпляру веб-части. Вы можете использовать ID веб-части:

webPartRibbonContextualGroup.Id = "Ribbon.MyContextualTabGroup." + ID;
// ...
webPartRibbonTab.Id = "Ribbon.MyTab." + ID;
// etc.
person Stefan    schedule 17.06.2011
comment
Я пробовал это раньше. Думаю, мне придется вернуться к этому. Не могли бы вы поделиться некоторыми советами, как скрыть / показать контекстные группы в зависимости от направленности веб-части? У меня по умолчанию отображаются все две группы. - person Moon; 17.06.2011