【问题标题】:SharePoint show Ribbon with multiple webparts on pageSharePoint 在页面上显示带有多个 Web 部件的功能区
【发布时间】:2011-12-21 00:35:59
【问题描述】:

我创建了一个共享点页面,其中包含一个 xslt webpart 和一个与问题无关的第二个 webpart

当我们添加第二个 Web 部件时,功能区栏被隐藏,您必须单击该 Web 部件才能再次显示功能区栏。 单击 webpart 不是我们可以向用户提出的要求,因此我试图让功能区栏在我们的 xslt listview webpart 的上下文中始终可见。

在搜索此问题时,我发现当您在 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

是否可以通过服务器端代码强制功能区栏可见,或者我可以在单击 web 部件以显示功能区栏时调用正在使用的 javascript 代码?

我认为使用 javascript 应该是可能的,因为如果您单击 xslt webpart,功能区是可见的,但我无法重现正在执行的代码。

【问题讨论】:

  • 我在这里介绍了缺少视图选择器的问题以及一些解决方案。我还没有考虑是否可以将相同的技术用于功能区。 blog.pentalogic.net/2011/03/…

标签: sharepoint sharepoint-2010 ribbon sharepoint-clientobject


【解决方案1】:

您可以使用 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); 
    } 
 });

【讨论】:

  • 你把这个放在哪里,在另一个 webpart 中?如果我通过控制台运行此代码,它可以工作,但是,如果我放入 web 部件,它不会
  • 点击日历外的任意位置,功能区消失。
【解决方案2】:

以下 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 是我的列表视图 Web 部件

【讨论】:

【解决方案3】:

一个很好的解决方案是在您的视图页面上获取主要 Web 部件的 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);
       }
}

【讨论】:

    【解决方案4】:

    低于使用 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");
    

    【讨论】:

      【解决方案5】:

      类似于 Thorstens 解决方案,我使用 jQuery 在 mouseenter 事件上触发 WpClick 函数。这种方法还可以解决当用户第一次进入页面并尝试使用其中一个菜单时完整工具栏出现异常的问题。如果需要,您可以为页面上任意数量的 Web 部件捕获事件气泡。例如:

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

      其中“body”可以是您想要的任何父元素,其中包含悬停时自动选择的 Web 部件。

      如果只关注一个 Web 部件,或者为了在大页面上获得最佳性能,您还可以直接在区域上设置事件。

      $("#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();
      

      【讨论】:

      • 出现错误 - el.createAttribute 不是函数。
      • 对不起。不知道为什么我有 el.createAttribute。它应该是 setAttribute。我更新了我原来的答案。谢谢!
      猜你喜欢
      • 2014-10-08
      • 2014-10-23
      • 2010-12-03
      • 2014-12-16
      • 2011-05-31
      • 1970-01-01
      • 2018-12-27
      • 2011-04-06
      • 2017-02-06
      相关资源
      最近更新 更多