web-dev-qa-db-fra.com

Utilisation de la méthode Xrm.WebApi dans une ressource Web ouvert dans une nouvelle fenêtre

J'ai ouvert une ressource Web HTML dans une nouvelle fenêtre à l'aide de:

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

Il s’agit d’une ressource Web HTML chargée de ClientObject dans la tête.

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

alors j'ai du JavaScript qui essaie de récupérer une Contact

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

mais c'est à défaut . J'ai suivi pas à pas dans la méthode Xrm.WebApi et constaté que l'erreur survient lorsqu'il tente de résoudre "contact" en Set Name

Code de 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()]
},

Pour une raison quelconque, l'objet window.ENTITY_SET_NAMES est null et une erreur (référence null) se produit

J'ai essayé d'intégrer ma ressource Web dans une page CRM et le code fonctionne correctement. Le problème semble être lorsque la ressource Web est lancée via Xrm.Navigation.openWebResource

Quelqu'un a-t-il essayé d'utiliser Xrm.WebApi dans le contexte d'une ressource Web ouverte avec Xrm.Navigation.openWebResource? ou quelqu'un sait-il si des étapes supplémentaires sont nécessaires pour récupérer les données?


Mettre à jour

ENTITY_SET_NAMES est initialisé dans main.aspx. J'ai essayé d'incorporer ma ressource Web personnalisée directement dans une nouvelle section Main Form et la méthode retrieveRecord fonctionne.

Il semble que ce soit un problème uniquement lors de l'exécution de la ressource Web à partir d'une nouvelle page via Xrm.Navigation.openWebResource


Mise à jour 2 - Réponse à Aron

J'ai essayé d'utiliser window.parent comme suggéré ci-dessous

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

et pour faire bonne mesure également essayé window.parent.top

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

mais les deux ont entraîné la même erreur

7
jasonscript

Cela ressemble à un bogue de produit dans ClientGlobalContext.js.aspx, car cela devrait vous permettre de travailler avec tout le contexte.

Vous pouvez probablement utiliser window.opener.Xrm dans ce scénario, car cela a fonctionné pour window.opener.Xrm.Page.getAttribute, cela devrait également fonctionner pour Xrm.WebApi.

Vous pouvez essayer d'accéder à la variable depuis la fenêtre d'ouverture comme ceci:

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

Selon cet article , lorsque vous référencez le formulaire principal à partir d’une ressource Web, nous devons référencer la fenêtre parente. Bien qu'il fasse uniquement référence à Xrm.Page et Xrm.Utility, il devrait également fonctionner avec Xrm.WebApi ...

Une ressource Web HTML ajoutée à un formulaire ne peut pas utiliser les objets globaux définis par la bibliothèque JavaScript chargée dans le formulaire. Une ressource Web HTML peut interagir avec les objets Xrm.Page ou Xrm.Utility du formulaire à l'aide de parent.Xrm.Page ou parent.Xrm.Utility, mais les objets globaux définis par les scripts de formulaire ne seront pas accessibles via le parent. 

S'il vous plaît essayer parent.Xrm.WebApi.retrieveRecord("contact", contactId, "$select=contactid,firstname,lastname");

Cet article montre également parent.Xrm.WebApi

2
Aron

Si vous envisagez d'utiliser des actions et des fonctions liées, vous devrez également ajouter une variable similaire pour mapper les entités sur leurs champs id principaux.

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

1
Jason Lattimer