SharePoint показывает ленту с несколькими веб-частями на странице

Я создал страницу sharepoint, которая имеет веб-часть xslt и вторую веб-часть, не имеющую отношения к вопросу

Когда мы добавляем эту вторую веб-часть, панель ленты скрывается, и вам нужно щелкнуть веб-часть, чтобы снова отобразить панель ленты. Нажатие на веб-часть - это не то, чего мы можем попросить у наших пользователей, поэтому я стараюсь, чтобы панель ленты всегда была видимой с помощью контекста нашей веб-части xslt listview.

При поиске этой проблемы я обнаружил, что при поиске этого скрытого поведения ленты с отражателем в исходном коде SharePoint кажется, что это поведение разработано Microsoft, как показано в примере ниже:

public override bool Visible { 
get {
if (!this.SingleWebPartPresentOnPage)
return false;
else
return base.Visible; 
} 
}

Кто-то с такой же проблемой, но без решения: http://www.glynblogs.com/2011/02/list-view-selector-missing-with-multiple-web-parts-in-sharepoint-2010.html

Можно ли заставить панель ленты отображаться с помощью кода на стороне сервера или я могу вызвать код javascript, который используется, когда я щелкаю веб-часть, чтобы отобразить панель ленты?

Я думаю, что это должно быть возможно с javascript, потому что, если вы щелкнете по веб-части xslt, лента будет видна, но я не могу воспроизвести код, который выполняется.


person GeertvdC    schedule 03.11.2011    source источник
comment
Здесь я рассмотрел проблему отсутствующего селектора представления вместе с парой решений. Я еще не подумал, можно ли использовать ту же технику для ленты. blog.pentalogic.net/2011/03/ < / а>   -  person Ryan    schedule 07.11.2011


Ответы (5)


вы можете использовать JavaScript, чтобы повторно выбрать XSLTListViewWebPart, чтобы лента снова появилась.

$(document).ready(function() { 
    var target = document.getElementById("MSOZoneCell_WebPartWPQ2"); 
    if(target != null) { 
        var fakeEvent = new Array();
        fakeEvent["target"] = target;
        fakeEvent["srcElement"] = target;
        WpClick(fakeEvent); 
    } 
 });
person Thorsten Hans    schedule 12.07.2012
comment
где вы это поместите, в другую веб-часть? если я запускаю этот код через консоль, он работает, однако, если я вставляю веб-часть, он не работает - person RSM; 25.07.2014
comment
При щелчке в любом месте за пределами календаря лента исчезает. - person Manveer Singh; 02.05.2018

Ниже у меня работал Javascript !!

<script>
setTimeout(function() {
var elem = document.getElementById("MSOZoneCell_WebPartWPQ4");
if(elem != null) {
var dummyevent = new Array();
dummyevent["target"] = elem;
dummyevent["srcElement"] = elem;
WpClick(dummyevent);
}
}, 100);
</script>

В приведенном выше сценарии MSOZoneCell_WebPartWPQ4 является моей веб-частью представления списка.

person John Jayaseelan    schedule 12.06.2013
comment
Ах, этот код тоже был здесь: stackoverflow.com/questions/4848892/ - person bgmCoder; 01.08.2013

Отличное решение - получить contextualInfo для основной веб-части на странице просмотра.

public class MyView : WebPart, IWebPartPageComponentProvider 
{

      protected override void CreateChildControls(){.............}
      public WebPartContextualInfo WebPartContextualInfo
      {
            get
            {
                // get default current view webart (WebPartWPQ2)
                ListViewWebPart listView = this.WebPartManager.WebParts
                     .OfType<ListViewWebPart>().FirstOrDefault();
                // use reflection to get non-public member containing contextualinfo
                var t = listView.GetType();
                WebPartContextualInfo oViewInfo = (WebPartContextualInfo)t.InvokeMember("Microsoft.SharePoint.WebControls.IWebPartPageComponentProvider.WebPartContextualInfo", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.GetProperty, null, listView, new object[] { });

                return oViewInfo;
            }
        }
        protected override void OnPreRender(EventArgs e)
        {

            SPRibbon ribbon = SPRibbon.GetCurrent(this.Page);
            // Ensure ribbon exists.
            if (ribbon != null)
            {
                // Load dependencies if not already on the page.
                ScriptLink.RegisterScriptAfterUI(this.Page, "SP.Ribbon.js", false, true);
            }
            base.OnPreRender(e);
       }
}
person Richard G    schedule 03.07.2013

Ниже представлена ​​версия, использующая сценарий SharePoint по запросу вместо тайм-аута 100 мс или jquery. Я думаю, что это более надежно, потому что оно выполняется точно после инициализации ленты.

SP.SOD.executeOrDelayUntilScriptLoaded(function () {
    //using setTimeout to ensure it will be executed after the code of sp.ribbon.js has done its initialization
    setTimeout(function () {
        //try to focus the default webpart so the ribbon will show
        var elem = document.getElementById("MSOZoneCell_WebPartWPQ2");
        if (elem != null) {
            var dummyevent = new Array();
            dummyevent["target"] = elem;
            dummyevent["srcElement"] = elem;
            WpClick(dummyevent);
        }
    }, 0);
}, "sp.ribbon.js");
person Gideon Mulder    schedule 10.01.2018

Подобно решению Thorstens, я использую jQuery для запуска функции WpClick при событии mouseenter. Этот подход также решает проблему, когда полная панель инструментов выходит из себя, когда пользователь впервые заходит на страницу и пытается использовать одно из меню. При желании вы можете захватить всплывающее окно событий для любого количества веб-частей на странице. Например:

$("body").on("mouseenter","#MSOZoneCell_WebPartWPQ2,#MSOzoneCell_WebPartWPQ3, . . . etc.",function() {
  WpClick(event);
});

Где «body» может быть любым родительским элементом, который вы хотите, который содержит веб-части для автоматического выбора при наведении курсора.

Если интересует только одна веб-часть, или для оптимальной производительности на больших страницах вы также можете установить событие непосредственно в зоне.

$("#MSOZoneCell_WebPartWPQ2").attr("onmouseenter","WpClick(event)");

или если jQuery недоступен

var el = document.getElementById("MSOZoneCell_WebPartWPQ2"); 
if(el != null) {
  el.setAttribute('onmouseenter','WpClick(event);');
}

При желании вы можете заставить ленту появляться после загрузки страницы и до того, как пользователь наведет курсор, запустив событие вручную. Просто включите соответствующий код после прикрепления события выше. например используя jQuery

$("#MSOZoneCell_WebPartWPQ2").mouseenter();
person Toadmyster    schedule 11.03.2014
comment
Получение ошибки - el.createAttribute не является функцией. - person love thakker; 23.08.2018
comment
Прости. Не уверен, почему у меня был el.createAttribute. Должен был быть установлен атрибут. Я обновил свой исходный ответ. Спасибо! - person Toadmyster; 29.10.2018