【问题标题】:In crm 2013 the AttributeInfo.GetValue returns wrong value在 crm 2013 中,AttributeInfo.GetValue 返回错误值
【发布时间】:2013-11-12 06:22:36
【问题描述】:

我们遇到了一个奇怪的问题,可以通过以下步骤重现:

  1. 打开新任务(或任何其他实体)
  2. 在“主题”字段中输入文本“测试主题”(或使用任何其他字段)。
  3. 使用这个 Xrm.Page.getAttribute("subject").getValue();声明 获取主题字段的值,它将返回“测试主题”。
  4. 现在清除主题字段。
  5. 使用这个 Xrm.Page.getAttribute("subject").getValue();声明 获取主题字段的值,它将返回“测试主题”, 这是错误的值,主题字段为空。

Xrm.Page.getAttribute("subject").getValue() 返回错误值。我们在 CRM 2011 中检查了这个问题,它没问题这个问题是 CRM 2013 特有的。

编辑:

  • 此代码由自定义功能区按钮触发。
  • 我们尝试将焦点更改为另一个控件,然后我们检查了值,它不起作用。

编辑:

  • 仅当字段为 required 字段时才会出现此问题。

【问题讨论】:

  • 好的,你的代码是从哪里调用的?
  • 无法重现错误。我希望您的 javascript 中的任何地方都没有硬编码值。
  • 奇怪!!我可以在浏览器控制台中重现它......
  • 好的,我不知道您在浏览器控制台中运行 JS。您是否为非必填字段尝试了相同的 JS?可能是它自动关注错误领域。我只是猜测:)
  • 我正在使用功能区按钮中的代码,上面是该代码的简化版本。相同的代码适用于非必填字段。

标签: dynamics-crm-2011 dynamics-crm dynamics-crm-2013


【解决方案1】:

CRM 页面的逻辑是只有在编辑的字段失去焦点时才会更改 Xrm.Page.data 对象内部的数据(此事件告诉 CRM 数据输入已完成),因此可能是在第 4 步之后你不会失去对其他领域的关注。此行为与 CRM 2011 中的行为相同。

【讨论】:

  • 以及如何在不失去控件焦点的情况下执行 javascript 代码(在另一个 onchange/onsave 事件中)?用魔法?他执行了 javascript 代码,因此该领域失去了焦点。
  • 看不到他在哪里执行了 Xrm.Page.getAttribute("subject").getValue() 语句。我已经在浏览器控制台中完成了该操作并重现了该问题。在 CRM 2011 中,它可以通过功能区按钮脚本进行复制。
  • 当然,如果你在浏览器控制台中执行,你会得到以前的值,因为该字段没有失去焦点,但在正常情况下,如果你执行另一个 onchange/onsave javascript 代码,你总是会丢失当前控件的焦点。因为他在另一个位置执行它的第二个getValue(或为同一控件的onchage),他得到的值意味着该字段失去焦点或根本不会执行javascript。 (正如他所说,这种行为只发生在 CRM 2013 中,因为他在 CRM 2011 中也会遇到这种情况)
  • 我已经尝试将焦点移到另一个控件,但它不起作用,抱歉我在最初的问题中没有提到它;我现在修改了我的问题。
【解决方案2】:

我认为您在这里有两个问题,尽管它们可能是由同一件事引起的。不幸的是,这不是对这些问题的回答,而是试图澄清上述问题。


问题 1:当输入一个空值时,JavaScript 会读取前一个值。

我认为这与这篇文章的原始问题相同。 这也发布在:http://partnersupport.microsoft.com/en-us/mpndynamics/forum/mpndyncrm/javascript-reads-previous-value-when-an-empty/f7b8dffd-3a21-48ae-8dca-4c5467ea8272

在参赛者表格上。
在名称字段中输入“Oliver”。
然后用 JavaScript 读取如下。

function ClickHandler()
{
    var nameValue = "";
    nameValue = locationValue = parent.Xrm.Page.getAttribute("name").getValue();   
   
    var test1 = "";
}
 

您应该会按预期获得“Oliver”。
然后回到竞争者表格,用退格键手动删除文本。
现在像之前一样使用 JavaScript 读取名称字段中的内容。
你会期望什么都得不到,但你会得到“奥利弗”。
现在在名称字段中输入 Mark。
使用 JavaScript 阅读该字段,您会得到应有的“标记”。
因此,似乎当在前一个值之后输入一个空值时,JavaScript 会读取前一个值。
换一种说法。如果 Name 字段有一个值并且文本随后被手动删除,则似乎存在问题。 Xrm.Page 对象不会更新为空字符串。但是,Xrm.Page 对象将更新为非空值。



问题 2:如果字段没有失去焦点,Javascript 无法读取文本字段中的值。

这也发布在http://partnersupport.microsoft.com/en-us/mpndynamics/forum/mpndyncrm/javascript-cannot-read-the-value-in-the-text-field/ecc2c9e0-fba0-44f2-93cd-320d042896f0?tm=1389885238744

如果字段没有失去焦点,Javascript 无法读取文本字段中的值。
在“定期约会”表单上,我有一个运行 Javascript 的 IFRAME。当按下按钮时,它会读取位置字段中的值。如果我将位置字段中的值更改为“Brunswick Street”并按下按钮,我什么也读不到(即在下面的代码中 locationValue 为空)。 但是,如果我将位置字段中的值更改为“Brunswick Street”。然后,我单击离开到 IFRAME 以外的表单上的某个位置,因此位置字段失去了焦点(这也可以通过在位置字段中输入文本后按 enter/tab 来实现)。如果我然后按下 IFRAME 上的按钮,Javascript 将正确读取位置字段中的文本。
我认为这是因为 parent.Xrm.Page 仅在字段中失去焦点时才会更新。

function ClickHandler()
{
    var locationValue = parent.Xrm.Page.getAttribute("location").getValue();
}

我尝试通过将 JavaScript 中的焦点设置为 requiredattendees 字段来更改焦点。但这不起作用。

parent.Xrm.Page.getControl("requiredattendees").setFocus();

我曾经使用 parent.document.forms[0].namedItem(srcDataFlds[fld]).value;获取 CRM 4 和 2011 中的值,但这在 CRM 2013 中不起作用。因此,正如 SDK 建议的那样,我将代码更改为使用 parent.Xrm.Page 但是它似乎给出了上述问题。

问题是为什么当我点击 IFRAME 上的按钮时焦点没有丢失?如果我单击表单中的任何字段,焦点会发生变化,那么为什么不是 IFRAME。 另外,如何让 JavaScript 读取位置字段中的值,而无需单击位置字段。 (希望以受支持的方式读取值)? 我只希望用户能够在位置字段中输入值并单击 IFRAME 中的按钮。 我还注意到,当您单击 IFRAME 时,不会为位置字段触发 On Change 事件。
到目前为止,唯一的方法是在单击触发 Javascript 的按钮之前单击另一个字段(或按 enter/tab)。

这两个问题都已被 Microsoft 识别并已在“Microsoft Dynamics CRM 2013 Service Pack 1 的更新汇总 1”中修复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2015-04-03
    • 2013-02-11
    • 2014-09-29
    • 2017-05-09
    相关资源
    最近更新 更多