2013-12-18 59 views
1

我正在構建一個應該顯示有關特定人員信息的Sharepoint 2013應用程序部分。人GUID將通過Sharepoint頁面URL中的querystring提供,並以某種方式將querystring(鍵/值)傳遞給所有iFrame/app部分。使用Sharepoint查詢字符串值作爲應用程序部分屬性

起初我希望能夠使用App部件的Element.xml文件中的自定義屬性將查詢字符串發送到iFrame(我期望Sharepoint足夠聰明,它有一個datatype = querystirng,它從SP抓取查詢字符串URL並將其推送到應用程序部分)。但是Elements.xml中的屬性似乎是靜態的,只能在編輯SP頁面時在「編輯Web部件」菜單中定義。

我試圖通過使用JavaScript(按照本指南,修改一下位:http://prasantabarik.wordpress.com/2013/09/26/pass-querystring-value-from-sharepoint-page-to-app-partclient-web-part/)將查詢字符串注入到Sharepoint頁面中包含的所有iframe中。即我打開所有的iframe,並更改了iframe.src(也嘗試過iframe.setAttribute(src,newSrc)),以包含JavaScript從windows.location.search中抓取的querystrings。這似乎工作80%的時間,頁面與應用程序部分加載與查詢字符串傳遞到所有應用程序部分成功加載。然而,其他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查詢字符串傳遞給應用程序部分!

問題以前在這裏問(https://sharepoint.stackexchange.com/questions/72189/use-query-string-value-as-app-part-property-2013)沒有任何答案,所以我試試我的運氣。

回答

1

您使用的是Chrome 30.x還是31.x?因爲在Chrome University of Wisconsin, dated November 23rd 2013這兩個版本中刷新iframe似乎存在問題。

+0

感謝尼古拉,這可能是答案,爲什麼我的JS在IE和FF,而不是Chrome瀏覽器...但是,我希望有另一種解決我的問題,它不需要JS 「黑客」。 – Howie

0

從SharePoint託管應用程序獲取當前頁面URL(使用查詢字符串)的腳本。

var currentPageURL = (window.location != window.parent.location) ? document.referrer : document.location; 
+0

感謝您嘗試幫助Ganesha,但這不起作用,因爲Sharepoint不直接在其iframe中調用Sharepoint託管的應用程序頁面,而是使用「重定向」處理程序。所以引用者將是沒有Sharepoint查詢字符串的重定向處理程序。 – Howie