Ausgangssituation:
In einem AppPart wird die URL der aspx Host-Seite benötigt, um die Daten abhängig von dieser zu speichern bzw. anzuzeigen.
Problembeschreibung:
document.referrer liefert nicht zwangsläufig immer die gleiche URL für eine bestimmte Seite. Der Grund dafür ist die Einstellung „Benutzerfreundliche URLs für neue Seiten automatisch erstellen“, die unter „Websiteeinstellungen | Navigation“ zu finden ist. Diese Eigenschaft ist bei der „Publishing Site“-Vorlage standardmäßig aktiviert. Eine Seite kann also sowohl mit der URL der Form http://spserver/MySubWeb/Seiten/MyFriendlyUrlSite.aspx als auch mit http://spserver/myfriendlyurlsite angesprochen werden. Zudem kann die URL noch Parameter enthalten (z.B. „ControlMode=Edit&DisplayMode=Design“). In dieser Situation stellt sich die Frage, wie man die vollständige URL innerhalb der App.js erhalten 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 vollständige URL zu bekommen, liefert uns die Variable “_spPageContextInfo“. Allerdings hat man es bei einem AppPart mit einem IFrame zu tun. Ich kann also diese Variable nicht auslesen. Die Lösung des Problems ist die Nutzung der window.postmessage Mehtode. Man kann dann mit Hilfe von window.postmessage mit der Host-Seite kommunizieren und die URL in den AppPart holen.
Ablauf allgemein:
- In App.js wird eine message an die Hostseite geschickt.
- Die Hostseite antwortet mit der richtigem URL, die mit der Hilfe von _spPageContextInfo gebaut wird.
- 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 finden ist.
Diese Lösung ist nur dann möglich, wenn auch die Möglichkeit besteht, das notwendige Javascript ins Hostweb einzufügen.
Referenzen:
http://msdn.microsoft.com/en-us/library/windows/apps/hh441295.aspx