以下を使用して、新しいウィンドウで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_NAMES
はmain.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");`
しかし、両方とも同じエラーになりました
私の ブログ :)
これを機能させるために、hacky回避策を実装しました。
Xrm.WebApiメソッドをデバッグしてきましたが、entitynameを取得してsetname(複数形)に解決しようとする行で失敗しています。これは、retrieveRecord
メソッドに渡された値を比較し、それをグローバル変数ENTITY_SET_NAMES
と比較することによって行われます。
私の例では、
contact
をcontacts
に解決しようとしています。
この変数は残念ながら存在せず、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
}
);
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;
バインドされたアクションと関数を使用する場合は、エンティティをプライマリIDフィールドにマップするために同様の変数を追加する必要もあります。
window["ENTITY_PRIMARY_KEYS"] = ['{"account":"accountid", "contact":"contactid"}'];
この記事 のように、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