6

我发现 SharePoint 2013 Online 中的页面加载(尚未在本地测试)从 MDS 回退到包含应用程序部件的任何页面的完整页面加载。

我发现这对于 SharePoint 托管的应用程序部件和提供商托管的应用程序部件都是如此。

我已经简化了页面以删除除基本 html 内容之外的所有内容,以确保某些已知问题(如脚本链接)不会导致问题。

作为我测试的一部分,我确认MDS对站点上的其他页面有效(例如:从一个文档库导航到另一个文档库)。

我已经阅读了一些关于 MDS 后备的文章,

但是我还没有看到有人提到应用程序部分会取消 MDS

这里有几篇我觉得有用的帖子。

http://steve.thelineberrys.com/gotchas-using-custom-web-parts-and-the-minimal-download-strategy/ http://www.wictorwilen.se/sharepoint-2013---introduction-to-最小下载策略-mds

编辑:我创建了 MDS 回退的提琴手跟踪。我没有看到作为响应的一部分生成的任何错误。可以在http://1drv.ms/1pWrlx3下载跟踪。

4

2 回答 2

5

好的,那个提琴手跟踪有很大帮助。您的 HTML 中有脚本,导致页面退出 MDS 模式。

下面的代码是罪魁祸首。它显示在您的应用程序部分的 iframe 正上方。您需要使用 SPPageContentManager.RegisterClientScriptBlock 在您的代码中注册该代码。

<script type='text/javascript'>
    var spAppIFrameSenderInfo = new Array(1);
    var SPAppIFramePostMsgHandler = function(e)
    {
        if (e.data.length > 100)
            return;

        var regex = RegExp(/(<\s*[Mm]essage\s+[Ss]ender[Ii]d\s*=\s*([\dAaBbCcDdEdFf]{8})(\d{1,3})\s*>[Rr]esize\s*\(\s*(\s*(\d*)\s*([^,\)\s\d]*)\s*,\s*(\d*)\s*([^,\)\s\d]*))?\s*\)\s*<\/\s*[Mm]essage\s*>)/);
        var results = regex.exec(e.data);
        if (results == null)
            return;

        var senderIndex = results[3];
        if (senderIndex >= spAppIFrameSenderInfo.length)
            return;

        var senderId = results[2] + senderIndex;
        var iframeId = unescape(spAppIFrameSenderInfo[senderIndex][1]);
        var senderOrigin = unescape(spAppIFrameSenderInfo[senderIndex][2]);
        if (senderId != spAppIFrameSenderInfo[senderIndex][0] || senderOrigin != e.origin)
            return;

        var width = results[5];
        var height = results[7];
        if (width == "")
        {
            width = '300px';
        }
        else
        {
            var widthUnit = results[6];
            if (widthUnit == "")
                widthUnit = 'px';

            width = width + widthUnit;
        }

        if (height == "")
        {
            height = '150px';
        }
        else
        {
            var heightUnit = results[8];                        
            if (heightUnit == "")
                heightUnit = 'px';

            height = height + heightUnit;
        }

        var widthCssText = "";
        var resizeWidth = ('False' == spAppIFrameSenderInfo[senderIndex][3]);
        if (resizeWidth)
        {
            widthCssText = 'width:' + width + ' !important;';
        }

        var cssText = widthCssText;
        var resizeHeight = ('False' == spAppIFrameSenderInfo[senderIndex][4]);
        if (resizeHeight)
        {
            cssText += 'height:' + height + ' !important';
        }

        if (cssText != "")
        {
            var webPartInnermostDivId = spAppIFrameSenderInfo[senderIndex][5];
            if (webPartInnermostDivId != "")
            {
                var webPartDivId = 'WebPart' + webPartInnermostDivId;

                var webPartDiv = document.getElementById(webPartDivId);
                if (null != webPartDiv)
                {
                    webPartDiv.style.cssText = cssText;
                }

                cssText = "";
                if (resizeWidth)
                {
                    var webPartChromeTitle = document.getElementById(webPartDivId + '_ChromeTitle');
                    if (null != webPartChromeTitle)
                    {
                        webPartChromeTitle.style.cssText = widthCssText;
                    }

                    cssText = 'width:100% !important;'
                }

                if (resizeHeight)
                {
                    cssText += 'height:100% !important';
                }

                var webPartInnermostDiv = document.getElementById(webPartInnermostDivId);
                if (null != webPartInnermostDiv)
                {
                    webPartInnermostDiv.style.cssText = cssText;
                }
            }

            var iframe = document.getElementById(iframeId);
            if (null != iframe)
            {
                iframe.style.cssText = cssText;
            }
        }
    }

    if (typeof window.addEventListener != 'undefined')
    {
        window.addEventListener('message', SPAppIFramePostMsgHandler, false);
    }
    else if (typeof window.attachEvent != 'undefined')
    {
        window.attachEvent('onmessage', SPAppIFramePostMsgHandler);
    }spAppIFrameSenderInfo[0] = new Array("EC5C9C4B0","g_8282237a_000e_4ab0_baf6_a4ad64ccc6ba","http:\u002f\u002fapp-bda070359d354c.apps","False","False","ctl00_ctl33_g_1581e83c_d38c_4be0_81eb_1015c2ac7a1b");
</script>
于 2014-04-03T20:12:13.163 回答
0

我发现 Sean Hesters 的以下文章解决了这个主题,对我回答这个问题非常有帮助:使用 SharePoints MDS 并围绕它工作

...如果您正在为 SharePoint 托管或提供商托管的解决方案开发 SharePoint 2013 应用程序部件,那么 MDS 的故事目前是惨淡的。在我写这篇文章的时候,SharePoint 用来在页面上呈现嵌入式应用程序部件的控件导致 MDS 失败:每个。单身的。时间。它不仅失败了,而且失败似乎是由 SharePoint 的内部引起的;无法通过使 App Parts MDS 兼容来解决此问题。我们使用 .NET Reflector 深入研究了 SharePoint 2013 源代码,发现用于呈现应用程序部件的 SPAppIFrame 控件使用 HtmlTextWriter 类发出原始标记。这使得 SPAppIFrame 控件不符合上面列出的 Microsoft 自己的建议的 MDS。您可以在我的同事 Eric Bowden 关于该主题的 StackOverflow 帖子中找到有关此问题的详细技术信息。ThreeWill 已向 SharePoint Online 团队开放支持票证以调查此问题,但这可能不是一个简单的解决方案,因此我们预计不会很快得到解决方案。不幸的是,目前托管解决方案开发人员没有太多选择:

  1. 使用应用程序而不是应用程序部件。
  2. 避免通过 start.aspx 将请求路由到不符合 MDS 的页面。
  3. 禁用 SharePoint Web 上的 MDS 功能。

所以基本上你不能这样做。如果您的网站页面中必须有应用程序部件,您最好禁用最小下载策略 (MDS),因为 MDS 会在它在您的页面中运行后强制发生这种情况。

于 2019-05-02T20:43:58.560 回答