我正在构建一个应用于显示特定人员信息的Sharepoint 2013应用程序部分。人员GUID将通过Sharepoint页面URL中的查询字符串提供,并以某种方式将查询字符串(键/值)传递到所有iFrame / app部分。
起初我希望我可以使用App部件的Element.xml文件中的自定义属性将查询字符串发送到iFrame(我希望Sharepoint足够聪明,它有一个数据类型= querystirng从SP URL获取查询字符串并将其推入应用程序部分)。但是Elements.xml中的属性看起来是静态的,只能在编辑SP页面时在“编辑Web部件”菜单中定义。
我尝试使用Javascript将查询字符串注入Sharepoint页面中包含的所有iframe(遵循本指南,并修改位:http://prasantabarik.wordpress.com/2013/09/26/pass-querystring-value-from-sharepoint-page-to-app-partclient-web-part/)。即我循环遍历所有iframe,并更改了iframe.src(也尝试了iframe.setAttribute(src,newSrc))以包含javascript从windows.location.search中获取的查询字符串。这似乎在80%的时间都有效,带有app部分的页面成功加载,并且查询字符串传递给所有应用程序部分。但是,其他20%的时间iframe.src设置正确但没有被浏览器重新加载(显示没有查询字符串的初始应用程序部分页面)。这似乎是我的Chrome v.31浏览器中的一个问题。在IE中,它每次都能成功运行。
以下是我的Sharepoint托管Javascript的代码段(包含在Sharepoint主模板的底部):
var sharepointQueryKeyValuePairs = {};
window.location.search.substr(1).split("&").forEach(function (pair) {
if (pair === "") return;
var parts = pair.split("=");
sharepointQueryKeyValuePairs[parts[0]] = parts[1];
});
var arrFrames = document.getElementsByTagName("iframe");
for (var i = 0; i < arrFrames.length; i++) {
var iFrame = arrFrames[i];
var clientID = encodeURIComponent("displayMode=spRedirect");
if (iFrame.src.indexOf(clientID) != -1) {
var querystring = encodeURIComponent("displayMode=sp");
var newIframeSrc = iFrame.src.replace(clientID, querystring);
var sharepointQueryKeyValuePairsCopy = {};
$.extend(sharepointQueryKeyValuePairsCopy, sharepointQueryKeyValuePairs);
newIframeSrc.split(encodeURIComponent('?'))[1].split(encodeURIComponent("&")).forEach(function (pair) {
if (pair === "") return;
var parts = pair.split(encodeURIComponent("="));
if (sharepointQueryKeyValuePairs.hasOwnProperty(parts[0])) {
newIframeSrc = newIframeSrc.replace(encodeURIComponent(parts[0] + "=" + parts[1]), encodeURIComponent(parts[0] + "=" + sharepointQueryKeyValuePairs[parts[0]]));
delete sharepointQueryKeyValuePairsCopy[parts[0]];
}
});
//todo: loop through sharepointQueryKeyValuePairsCopy and inject the rest of the querystring values
iFrame.setAttribute('src', newIframeSrc);
//also tried iFrame.src = newIframeSrc;
}
}
有没有人对如何运作有任何想法?优选地建议更整洁的解决方案。我不喜欢javascript解决方案,应该有另一种更优雅的方式将SP查询字符串传递给app部分!
之前在此问过的问题(https://sharepoint.stackexchange.com/questions/72189/use-query-string-value-as-app-part-property-2013)没有任何答案,所以我试试运气。
答案 0 :(得分:1)
您使用的是Chrome 30.x还是31.x?因为在Chrome University of Wisconsin, dated November 23rd 2013的这两个版本中刷新iframe似乎存在问题。
答案 1 :(得分:0)
从SharePoint托管应用获取当前页面URL(带有查询字符串)的脚本。
var currentPageURL = (window.location != window.parent.location) ? document.referrer : document.location;