Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

Kommunikation zwischen einer SharePoint-Hosted App und der aspx Host-Seite

Ausgangssituation:
In einem AppPart wird die URL der aspx Host-Seite benö­tigt, um die Daten abhän­gig von die­ser zu spei­chern bzw. anzuzeigen.

Problembeschreibung:
document.referrer lie­fert nicht zwangs­läu­fig immer die glei­che URL für eine bestimmte Seite. Der Grund dafür ist die Einstellung „Benutzerfreundliche URLs für neue Seiten auto­ma­tisch erstel­len“, die unter „Websiteeinstellungen | Navigation“ zu fin­den ist. Diese Eigenschaft ist bei der „Publishing Site“-Vorlage stan­dard­mä­ßig akti­viert. Eine Seite kann also sowohl mit der URL der Form http://spserver/MySubWeb/Seiten/MyFriendlyUrlSite.aspx als auch mit http://spserver/myfriendlyurlsite ange­spro­chen wer­den. Zudem kann die URL noch Parameter ent­hal­ten (z.B. „ControlMode=Edit&DisplayMode=Design“). In die­ser Situation stellt sich die Frage, wie man die voll­stän­dige URL inner­halb der App.js erhal­ten kann. Leider gibt es keine Standard-Tokens (vgl. http://msdn.microsoft.com/de-de/library/jj163816.aspx), die die URL der aspx Host-Seite liefern.

Lösung:
Die Möglichkeit, die voll­stän­dige URL zu bekom­men, lie­fert uns die Variable “_spPageContextInfo“. Allerdings hat man es bei einem AppPart mit einem IFrame zu tun. Ich kann also diese Variable nicht aus­le­sen. Die Lösung des Problems ist die Nutzung der window.postmessage Mehtode. Man kann dann mit Hilfe von window.postmessage mit der Host-Seite kom­mu­ni­zie­ren und die URL in den AppPart holen.

Ablauf all­ge­mein:

  1. In App.js wird eine mes­sage an die Hostseite geschickt.
  2. Die Hostseite ant­wor­tet mit der rich­ti­gem URL, die mit der Hilfe von _spPageContextInfo gebaut wird.
  3. Nach dem Erhalt der Antwort wird die Ausführung der App fortgesetzt.

App.js

$(document).ready(function () {
     var target = parent.postMessage?parent:(parent.document.postMessage?parent.document:undefined);
     target.postMessage('GetPageUrl', decodeURIComponent(getQueryStringParameter('SPHostUrl')));
     });

window.addEventListener('message', function (e) { var spHostUrl = decodeURIComponent(getQueryStringParameter('SPHostUrl')); if (spHostUrl.indexOf(e.origin) === -1) return; Init(e.data); });

PostMessageCommunication.js wird in Hostseite angebunden.

window.addEventListener('message', function (event) {
     if (event.origin.indexOf("w2k12sqlspapps.sp2013dev.local") === -1) return;
     sendResponse(event);
     }, false);

function sendResponse(event){ var webServerUrl = _spPageContextInfo.siteAbsoluteUrl.replace(_spPageContextInfo.webServerRelativeUrl, "");     var pageUrl = webServerUrl + _spPageContextInfo.serverRequestPath;     event.source.postMessage(pageUrl, event.origin); }

Dabei ist “w2k12sqlspapps.sp2013dev.local” der App Domain Name, der in der CA unter _admin/ConfigureAppSettings.aspx zu fin­den ist.

Diese Lösung ist nur dann mög­lich, wenn auch die Möglichkeit besteht, das not­wen­dige Javascript ins Hostweb einzufügen.

Referenzen:

http://msdn.microsoft.com/en-us/library/windows/apps/hh441295.aspx

http://social.msdn.microsoft.com/Forums/en-US/956d92fb-e0b3-4f32-9dae-c5ba5948949b/get-host-page-url-in-app-part?forum=appsforsharepoint

10. Januar 2014

Pin It on Pinterest