"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)
我查看了 p0
和 p1
的值,发现它们没有 category
属性。但是,当我在页面本身上时尝试使用相同的代码来设置相同查找字段的值(即省略 window.opener', and even calling a
refresh`)时,我没有收到任何错误。
此外,我注释掉了 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 方法,我有时会遇到一些回调问题。
我有一个 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)
我查看了 p0
和 p1
的值,发现它们没有 category
属性。但是,当我在页面本身上时尝试使用相同的代码来设置相同查找字段的值(即省略 window.opener', and even calling a
refresh`)时,我没有收到任何错误。
此外,我注释掉了 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 方法,我有时会遇到一些回调问题。