我发现SharePoint 2013 Online中的页面加载(尚未测试On-prem)从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-the-minimal-download-strategy-mds
编辑:我创建了一个MDS后备的小提琴曲。我没有看到作为回复的一部分而产生的任何错误。跟踪可以在http://1drv.ms/1pWrlx3下载。
答案 0 :(得分: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>
答案 1 :(得分:0)
我发现肖恩·海斯特斯(Sean Hesters)撰写的以下文章涉及该主题,对我回答这个问题非常有帮助:Working with and around SharePoints MDS
...如果要为以下产品开发SharePoint 2013 App Parts SharePoint托管或提供商托管的解决方案,目前的MDS故事 惨淡。在撰写本文时,SharePoint使用的控件 在页面上呈现嵌入式App Parts会导致MDS失败:每一次。 单。时间。它不仅失败,而且失败似乎是 由SharePoint内部造成;无法通过以下方式解决此问题 使App Parts MDS兼容。我们挖掘了SharePoint 2013源 使用.NET Reflector,发现使用了SPAppIFrame控件 使用HtmlTextWriter渲染App Parts发出原始标签 类。这使得SPAppIFrame控件不符合MDS 上面列出的Microsoft自己的建议。你可以找到详细的 我的同事埃里克·鲍登(Eric Bowden) 关于该主题的StackOverflow帖子。 ThreeWill有一张支持票 与SharePoint Online团队一起调查此问题,但是 可能不是一个容易解决的问题,所以我们不希望任何时候都能解决 不久。不幸的是,这并没有为托管服务留下很多选择 目前的解决方案开发人员:
- 使用Apps代替App Parts。
- 避免通过start.aspx将请求路由到不兼容MDS的页面。
- 在SharePoint网站上禁用MDS功能。
所以基本上您不能那样做。如果您的网站页面中必须包含App部件,则最好禁用“最小下载策略(MDS)”,因为MDS会在页面中运行后强制执行该操作。