在新窗口中打开Web资源中使用Xrm.WebApi方法

jas*_*ipt 8 javascript microsoft-dynamics dynamics-crm dynamics-crm-webapi dynamics-365

我使用以下命令在新窗口中打开了一个HTML Web资源:

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

这是一个HTML Web资源,它正在加载ClientObject

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

然后我有一些试图检索的JavaScript Contact

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

但这是失败的.我已逐步跟踪到该Xrm.WebApi方法,并发现错误是在它尝试解析"contact"为a时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()]
},
Run Code Online (Sandbox Code Playgroud)

由于某种原因,该window.ENTITY_SET_NAMES对象为null,因此发生错误(空引用)

我已经尝试将我的Web资源嵌入到CRM页面中,并且代码可以正常工作.问题似乎是通过网络资源启动时 Xrm.Navigation.openWebResource

有没有人试图Xrm.WebApi在打开的网络资源的上下文中使用Xrm.Navigation.openWebResource?或者是否有人知道检索数据是否还需要其他步骤?


更新

ENTITY_SET_NAMES初始化main.aspx.我尝试将我的自定义Web资源直接嵌入到新的Main Form部分,该retrieveRecord方法可行.

只有在通过新页面运行Web资源时,这才会出现问题 Xrm.Navigation.openWebResource


更新2 - 对Aron的回应

我尝试使用window.parent如下建议

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

而且好的措施也尝试过 window.parent.top

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

但两者都导致了同样的错误

Aru*_*oth 5

听起来像是 中的产品错误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;
Run Code Online (Sandbox Code Playgroud)


jas*_*ipt 3

我的博客:)


为了让这个工作正常进行,我实施了一个hacky解决方法。

我一直在调试 Xrm.WebApi 方法,但它在尝试获取实体名称并将其解析为集合名称(复数)的行上失败。它通过比较传递给方法的值retrieveRecord并将其与全局变量进行比较来实现这一点ENTITY_SET_NAMES

在我的例子中,它试图contact解决contacts

不幸的是,该变量不存在并Xrm.WebApi引发错误

我的解决方法是检查此变量,如果存在则创建它!ENTITY_SET_NAMES是一个可解析的 JSON 字符串,其中包含每个实体的逻辑名称和集名称。

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

在对方法的任何调用之前执行此行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
  }
);
Run Code Online (Sandbox Code Playgroud)