webentwicklung-frage-antwort-db.com.de

Die Verwendung der Xrm.WebApi-Methode in der Webressource wurde in einem neuen Fenster geöffnet

Ich habe eine HTML-Webressource in einem neuen Fenster geöffnet:

Xrm.Navigation.openWebResource(webResource, windowOptions, data);

Dies ist eine HTML-Webressource, die das ClientObject in den Kopf lädt

<script type="text/javascript" src="../../../ClientGlobalContext.js.aspx" ></script>

dann habe ich ein JavaScript, das versucht, eine Contact abzurufen

var contactId = "8553DA63-11C9-E711-A824-000D3AE0CB84";
var promise = Xrm.WebApi.retrieveRecord("contact", contactId, "$select=contactid,firstname,lastname");`

aber das ist scheitern . Ich habe mich schrittweise mit der Xrm.WebApi-Methode befasst und festgestellt, dass der Fehler auftritt, wenn versucht wird, "contact" in einen Set Name aufzulösen.

Code aus Global.ashx

getEntitySetName: function(logicalName) {
    Mscrm.Utilities.addTelemetryLog("Xrm.Utility.getEntitySetName");
    var $v_0 = window.ENTITY_SET_NAMES || window.top.ENTITY_SET_NAMES;
    if (IsNull(this.$5H_1) && !isNullOrEmptyString($v_0))
        this.$5H_1 = JSON.parse($v_0);
    return this.$5H_1[logicalName.toLowerCase()]
},

Aus irgendeinem Grund ist das Objekt window.ENTITY_SET_NAMES null, sodass ein Fehler (Nullreferenz) auftritt

Ich habe versucht, meine Webressource in eine CRM-Seite einzubetten, und der Code funktioniert ordnungsgemäß. Das Problem scheint zu sein, wenn die Webressource über Xrm.Navigation.openWebResource gestartet wird.

Hat jemand versucht, Xrm.WebApi im Kontext einer mit Xrm.Navigation.openWebResource geöffneten Webressource zu verwenden? oder weiß jemand, ob zusätzliche schritte erforderlich sind, um daten abzurufen?


Update

ENTITY_SET_NAMES wird in main.aspx initialisiert. Ich habe versucht, meine benutzerdefinierte Webressource direkt in einen neuen Abschnitt Main Form einzubetten, und die Methode retrieveRecord funktioniert.

Dies ist anscheinend nur dann ein Problem, wenn die Webressource über Xrm.Navigation.openWebResource von einer neuen Seite aus ausgeführt wird.


Update 2 - Antwort auf Aron

Ich habe versucht, window.parent wie unten vorgeschlagen zu verwenden

var contactId = "8553DA63-11C9-E711-A824-000D3AE0CB84";
var promise = parent.Xrm.WebApi.retrieveRecord("contact", contactId, "$select=contactid,firstname,lastname");`

und aus gutem Grund auch ausprobiert window.parent.top

var contactId = "8553DA63-11C9-E711-A824-000D3AE0CB84";
var promise = parent.top.Xrm.WebApi.retrieveRecord("contact", contactId, "$select=contactid,firstname,lastname");`

aber beide führten zu demselben Fehler

7
jasonscript

Mein Blog :)


Um dies zum Laufen zu bringen, habe ich eine hacky Umgehung implementiert.

Ich habe die Xrm.WebApi-Methode getestet und sie schlägt in einer Zeile fehl, in der versucht wird, den -Entitätsnamen in den -Setnamen aufzulösen (Plural). Dazu wird der in die retrieveRecord -Methode übergebene Wert verglichen und mit einer globalen Variablen ENTITY_SET_NAMES Verglichen.

In meinem Beispiel wird versucht, contact in contacts aufzulösen.

Diese Variable ist leider nicht vorhanden und Xrm.WebApi Gibt einen Fehler aus

Meine Abhilfe besteht darin, nach dieser Variablen zu suchen, und wenn sie nicht vorhanden ist, dann erstelle sie! ENTITY_SET_NAMES Ist eine JSON-analysierbare Zeichenfolge, die den logischen Namen und den Sätzenamen für jede Entität enthält.

window["ENTITY_SET_NAMES"] = window["ENTITY_SET_NAMES"] || JSON.stringify({
  "account" : "accounts",
  "contact" : "contacts"
});

Das Ausführen dieser Zeile vor Aufrufen von Xrm.WebApi - Methoden scheint zu funktionieren, und ich erhalte jetzt Ergebnisse

Hier ist der komplette Ausschnitt:

window["ENTITY_SET_NAMES"] = window["ENTITY_SET_NAMES"] || JSON.stringify({
  "account" : "accounts",
  "contact" : "contacts"
});

var contactId = "8553DA63-11C9-E711-A824-000D3AE0CB84";
Xrm.WebApi.retrieveRecord(
  "contact", 
  contactId, 
  "$select=contactid,firstname,lastname"
).then(
  function success(result) {
    console.log(result.firstname);
    // perform operations on record retrieval
  },
  function (error) {
    console.log(error.message);
    // handle error conditions
  }
);
3
jasonscript

Klingt nach einem Produktfehler in ClientGlobalContext.js.aspx, da dies den gesamten Kontext für die Arbeit geben soll.

Wahrscheinlich können Sie window.opener.Xrm in diesem Szenario verwenden, da es funktioniert hat für window.opener.Xrm.Page.getAttribute sollte es auch für Xrm.WebApi funktionieren.

Sie können versuchen, auf die Variable über das Öffnerfenster wie folgt zuzugreifen:

window["ENTITY_SET_NAMES"] = window["ENTITY_SET_NAMES"] || window.opener.top.ENTITY_SET_NAMES;
2
Arun Vinoth

Gemäß diesem Artikel müssen wir beim Referenzieren des Hauptformulars aus einer Webressource auf das übergeordnete Fenster verweisen. Es verweist zwar nur auf Xrm.Page und Xrm.Utility, sollte aber auch mit Xrm.WebApi funktionieren ...

Eine einem Formular hinzugefügte HTML-Webressource kann keine globalen Objekte verwenden, die von der in das Formular geladenen JavaScript-Bibliothek definiert werden. Eine HTML-Webressource kann mit den Xrm.Page - oder Xrm.Utility -Objekten im Formular interagieren, indem sie parent.Xrm.Page oder parent.Xrm.Utility verwendet, aber Von Formularskripts definierte globale Objekte sind nicht über das übergeordnete Objekt zugänglich. 

Bitte versuchen Sie es mit parent.Xrm.WebApi.retrieveRecord("contact", contactId, "$select=contactid,firstname,lastname");

Dieser Artikel zeigt auch parent.Xrm.WebApi

2
Aron

Wenn Sie gebundene Aktionen und Funktionen verwenden, müssen Sie auch eine ähnliche Variable hinzufügen, um den primären ID-Feldern Entitäten zuzuordnen.

window["ENTITY_PRIMARY_KEYS"] = ['{"account":"accountid", "contact":"contactid"}'];

1
Jason Lattimer