使用Sharepoint查询字符串值作为App-part属性

时间:2013-12-18 11:09:32

标签: javascript sharepoint sharepoint-2013

我正在构建一个应用于显示特定人员信息的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)没有任何答案,所以我试试运气。

2 个答案:

答案 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;
相关问题