设置
我正在向现场 CRM 2011 中的自定义实体添加约会。
- 我单击功能区上的“新建事件”按钮,选择“约会”,然后单击“确定”。
- 在打开的新窗口中,我按 F12 打开 IE 调试器,然后选择“脚本”选项卡,在我的 onLoad 函数和 FormScript.js.aspx 文件的 crmForm_window_onload_handler 中设置一个断点,然后单击开始调试按钮。
- 然后我重新加载约会窗口。
问题
crmForm_window_onload_handler 中的断点命中,但是当我进入我的自定义 js Web 资源文件 (appointment.js) 的 onLoad 函数时,而不是进入我的 appointment.js 文件的 onLoad 函数,它会执行进入我文件的精确副本的 onLoad,只有它的名字是脚本 block (0-99 中的一些随机数)即 script block(23)
。为什么要创建这些脚本 block ?在保存时,我也在运行这段代码:
Xrm.Page.getAttribute('new_issyncreqd').setValue(true);
Xrm.Page.getAttribute('new_issyncreqd').setSubmitMode("always");
但它实际上并没有保存,我猜它与脚本 block 有关......
更新
我确实弄清楚了为什么更新 IsSyncReqrdField 的代码不起作用。这适用于现场 CRM 2011 版本 V 5.0.9690.1992(汇总 6)。它显然有一个 Appointment 实体的错误,它首先保存实体,然后实际运行自定义 onSave 代码。这是它目前的样子:
function crmForm_onsave_handler(eventObj,eventArgs)
{
try
{
var eContext=Mscrm.FormUtility.constructExecutionObject(eventObj,0,eventArgs,null);
eContext = Mscrm.FormUtility.constructExecutionObject(eventObj,0,eventArgs,eContext)
Mscrm.Form_onsave();
eContext=Mscrm.FormUtility.constructExecutionObject(eventObj,1,eventArgs,eContext)
NEW.Appointment.onSave(eContext); // <-- My custom OnSave Handler
}
catch(e)
{
displayError('crmForm', 'onsave', e.description);
}
}
错误在于 Mscrm.Form_onsave();
行实际上是将记录保存到数据库中,因此当自定义事件处理程序运行时,它已经被保存,并且在自定义事件处理程序不会更新记录。
这个bug的修复是在form的onLoad中设置bSaveInProgress = true;
,然后
bSaveInProgress = !isValid;
event.returnValue = isValid;
在保存。 bSaveInProgress = true;
将阻止 Mscrm.Form_onsave();
实际保存记录,而 event.returnValue 将实际导致创建记录。它有效并且是一个黑客,但这是我想出的唯一解决这个错误的方法......
问题依然存在
为什么要创建和执行脚本 block 而不是使用已经存在的文件?
最佳答案
首先,当内联 javascript 来自 XML 或 SVG 文件时,会创建脚本 block 。
这是一个已知的 IE 问题(扫描“脚本 block ”):http://msdn.microsoft.com/en-us/ie/ff959805.aspx
您可以使用 IE9 中的“网络”选项卡查看 XML 文件,然后捕获表单加载。应该有一些实际上是 XML 的 aspx 文件。一个示例是 RenderGridView.aspx。
所以问题是再次检索 aspx 文件,然后执行内联函数替换以前的脚本 block (因为 javascript 作为单个全局文件运行)。
关于javascript - 在 CRM 2011 中为从功能区打开的表单调试 javascript 时,如何创建脚本 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229604/