5

设置

我正在向现场 CRM 2011 中的自定义实体添加约会。

  • 我单击功能区上的“新活动”按钮,选择约会,然后确定。
  • 在打开的新窗口中,我按 F12 打开 IE 调试器,然后选择脚本选项卡,在我的 onLoad 函数和 FormScript.js.aspx 文件的 crmForm_window_onload_handler 中设置断点,然后单击开始调试按钮.
  • 然后我重新加载约会窗口。

问题

crmForm_window_onload_handler 中的断点命中,但是当我进入我的自定义 js Web 资源文件 (appointment.js) 的 onLoad 函数时,而不是进入我的约会.js 文件的 onLoad 函数,它进入了 onLoad我的文件的精确副本,只有它的名称是脚本块(0-99 的一些随机数),即script block(23). 为什么要创建这些脚本块?在保存中,我也在运行此代码:

Xrm.Page.getAttribute('new_issyncreqd').setValue(true);
Xrm.Page.getAttribute('new_issyncreqd').setSubmitMode("always");

但它实际上并没有保存,我猜它与脚本块有关......


更新

我确实弄清楚了为什么更新 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的修复是bSaveInProgress = true;在表单的onLoad中设置,然后bSaveInProgress = !isValid; event.returnValue = isValid; 在 onSave 中。将bSaveInProgress = true;阻止Mscrm.Form_onsave();实际保存记录,并且 event.returnValue 实际上会导致它被创建。它有效并且是一个黑客,但这是我想出解决这个错误的唯一方法......


问题依然存在

为什么要创建和执行脚本块而不是使用已经存在的文件?

4

2 回答 2

1

首先,当内联 javascript 来自 XML 或 SVG 文件时,会创建脚本块。

这是一个已知的 IE 问题(扫描“脚本块”):http: //msdn.microsoft.com/en-us/ie/ff959805.aspx

您可以通过使用 IE9 中的“网络”选项卡然后捕获表单加载来查看 XML 文件。应该有一些实际上是 XML 的 aspx 文件。一个示例是 RenderGridView.aspx。

所以问题是再次检索 aspx 文件,然后执行内联函数替换前一个脚本块(因为 javascript 作为单个全局文件运行)。

于 2012-07-24T21:43:30.170 回答
0

在设置代码中断之前尝试单击“开始调试”按钮。另外,你用的是IE8还是9?

于 2012-04-20T18:39:25.150 回答