web-dev-qa-db-ja.com

新しいウィンドウで開いたWebリソースでXrm.WebApiメソッドを使用する

以下を使用して、新しいウィンドウでHTMLWebリソースを開きました。

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

これはHTMLWebリソースであり、ClientObjectをヘッドにロードしています。

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

次に、Contactを取得しようとしているJavaScriptがあります。

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

しかし、これは失敗です。 Xrm.WebApiメソッドにステップトレースしたところ、エラーは"contact"Set Nameに解決しようとしたときに発生することがわかりました。

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

何らかの理由でwindow.ENTITY_SET_NAMESオブジェクトがnullであるため、エラー(null参照)が発生します

WebリソースをCRMページに埋め込もうとしましたが、コードは正しく機能します。問題は、WebリソースがXrm.Navigation.openWebResourceを介して起動されたときに発生するようです。

Xrm.WebApiで開かれたWebリソースのコンテキストでXrm.Navigation.openWebResourceを使用しようとした人はいますか?または、データを取得するために必要な追加の手順があるかどうか誰かが知っていますか?


更新

ENTITY_SET_NAMESmain.aspxで初期化されます。カスタムWebリソースを新しいMain Formセクションに直接埋め込もうとしましたが、retrieveRecordメソッドが機能します。

これは、新しいページからXrm.Navigation.openWebResourceを介してWebリソースを実行する場合にのみ問題になるようです。


更新2-アロンへの応答

以下に示すように、window.parentを使用してみました

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

そして、良い測定のためにwindow.parent.topも試しました

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

しかし、両方とも同じエラーになりました

8
jasonscript

私の ブログ :)


これを機能させるために、hacky回避策を実装しました。

Xrm.WebApiメソッドをデバッグしてきましたが、entitynameを取得してsetname(複数形)に解決しようとする行で失敗しています。これは、retrieveRecordメソッドに渡された値を比較し、それをグローバル変数ENTITY_SET_NAMESと比較することによって行われます。

私の例では、contactcontactsに解決しようとしています。

この変数は残念ながら存在せず、Xrm.WebApiはエラーをスローします

私の回避策は、この変数をチェックし、それがnot存在する場合は、それを作成することです。 ENTITY_SET_NAMESは、各エンティティの論理名とセット名を含むJSONで解析可能な文字列です。

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

Xrm.WebApiメソッドの呼び出しが機能しているように見える前にこの行を実行すると、結果が得られます

完全なスニペットは次のとおりです。

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

ClientGlobalContext.js.aspx内の製品のバグのように聞こえます。これにより、作業するコンテキスト全体が得られるはずです。

おそらく、このシナリオではwindow.opener.Xrmを利用できます。これは、 機能したwindow.opener.Xrm.Page.getAttributeに対しても、Xrm.WebApiに対しても機能するはずだからです。

次のように、オープナーウィンドウから変数にアクセスしてみてください。

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

バインドされたアクションと関数を使用する場合は、エンティティをプライマリIDフィールドにマップするために同様の変数を追加する必要もあります。

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

この記事 のように、Webリソースからメインフォームを参照するときは、親ウィンドウを参照する必要があります。 Xrm.PageとXrm.Utilityのみを参照しますが、Xrm.WebApi ...でも機能するはずです。

フォームに追加されたHTMLWebリソースは、フォームにロードされたJavaScriptライブラリによって定義されたグローバルオブジェクトを使用できません。 HTML Webリソースは、parent.Xrm.Pageまたは-を使用して、フォーム内のXrm.PageまたはXrm.Utilityオブジェクトと対話できます。 parent.Xrm.Utilityですが、フォームスクリプトで定義されたグローバルオブジェクトには、親を使用してアクセスできません。

parent.Xrm.WebApi.retrieveRecord("contact", contactId, "$select=contactid,firstname,lastname");をお試しください

この記事parent.Xrm.WebApi

2
Aron