"Function Expected" 设置查找字段后 JsProvider.ashx 中的错误

"Function Expected" error in JsProvider.ashx after setting a lookup field

我有一个 HTML 页面,在单击自定义实体页面的功能区按钮时会打开该页面。此页面中的 JS 代码 运行 执行一些业务逻辑,最终需要在自定义实体页面上更新查找字段。

目前,为了设置查找值,我正在做类似以下的事情*:

window.opener.Xrm.Page.getAttribute("ik_reportid").setValue([{
    id: "d67aa9d8-c528-e711-80f2-005056b74923",
    name: "test record",
    entityType: "ik_report"
}]);

*注:为了简化本题,硬编码了以上内容。我向你保证,问题不在于这些值,而在于其他地方。

这样做之后,HTML 页面继续其现有代码,最终调用 window.opener.Page.data.refresh(true),然后用 window.close().

自行关闭

问题是当 opener 页面刷新时,我收到错误 "function expected",打开调试器让我进入 JsProvider.ashx 中的以下行:

Mscrm.FormInputControl.LookupUIBehavior.I=function($p0,$p1){if(!parseInt($p0.type)&&!parseInt($p1.type)||parseInt($p0.category)===LookupItemCategories.UNKNOWN_EMAIL&&parseInt($p1.category)===LookupItemCategories.UNKNOWN_EMAIL)

我查看了 p0p1 的值,发现它们没有 category 属性。但是,当我在页面本身上时尝试使用相同的代码来设置相同查找字段的值(即省略 window.opener', and even calling arefresh`)时,我没有收到任何错误。

此外,我注释掉了 HTML 页面代码中的 refresh 调用。这也没有帮助:当我点击实体页面上的保存按钮时,我再次收到 "function expected" 错误,现在在 Global.ashx 中(b 应该是一个函数,显然):

Sys._isInstanceOfType=function(c,b){if(typeof b==="undefined"||b===null)return false; if(b instanceof c) return true;

不知道是什么原因造成的。欢迎任何帮助。

在windows之间发帖应该可以满足您的要求。您可以找到更多信息 here 基本上在你的 parent window 中做这样的事情:

window.onmessage = function (e) {
     //e.data will contain some payload
    Xrm.Page.getAttributes("xxx").setValue(e.data);
};

或兼容所有浏览器:

if (window.addEventListener) {
  window.addEventListener('message', function (e) {
    //e.data will contain some payload
    Xrm.Page.getAttributes("xxx").setValue(e.data);
  });
}
else { // IE8 or earlier
  window.attachEvent('onmessage', function (e) {
     //e.data will contain some payload
     Xrm.Page.getAttributes("xxx").setValue(e.data);
  });
}

现在在你的 child window 中只使用 postMessage

发送结果
window.opener.postMessage("I'm the result", '*');

我通常会这样处理你描述的场景。另一种解决方案是在 parent window

上创建回调
window.callback = function() {
   //do your stuff here
}

并从 child window 调用此回调:

childWindow.opener.callback();

但我个人更喜欢 postMessage 方法,我有时会遇到一些回调问题。