Dynamics crm 2011 在crm 2013中,AttributeInfo.GetValue返回错误的值

Dynamics crm 2011 在crm 2013中,AttributeInfo.GetValue返回错误的值,dynamics-crm-2011,dynamics-crm,dynamics-crm-2013,Dynamics Crm 2011,Dynamics Crm,Dynamics Crm 2013,我们遇到了一个奇怪的问题,可以通过以下步骤重现: 打开新任务(或任何其他实体) 在“主题”字段中输入文本“测试主题”(或使用任何其他字段) 使用这个Xrm.Page.getAttribute(“subject”).getValue();对 获取subject字段的值,它将返回“testsubject” 现在清除主题字段 使用这个Xrm.Page.getAttribute(“subject”).getValue();对 获取主题字段的值,返回“Test subject”, 这是错误的值,主题字段为

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

  • 打开新任务(或任何其他实体)
  • 在“主题”字段中输入文本“测试主题”(或使用任何其他字段)
  • 使用这个Xrm.Page.getAttribute(“subject”).getValue();对 获取subject字段的值,它将返回“testsubject”
  • 现在清除主题字段
  • 使用这个Xrm.Page.getAttribute(“subject”).getValue();对 获取主题字段的值,返回“Test subject”, 这是错误的值,主题字段为空
  • Xrm.Page.getAttribute(“subject”).getValue()返回了错误的值。我们在CRM 2011中检查了此问题,其确定此问题特定于CRM 2013

    编辑:

    • 此代码是从自定义功能区按钮激发的
    • 我们尝试将焦点更改为另一个控件,然后检查该值,结果无效
    编辑:

    • 仅当该字段为
      必填字段时才会出现此问题

    CRM页面的逻辑是,仅当编辑的字段失去焦点时(此事件告诉CRM数据输入已完成),它才会更改Xrm.page.data对象内的数据,因此在步骤4之后,您不会失去对其他字段的焦点。这种行为与CRM 2011中的行为相同。

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


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

    我想这和这篇文章最初的问题是一样的。 此网页亦载于:

    在竞争对手表格上。
    在名称字段中输入“Oliver”。
    然后用JavaScript阅读它,如下所示

    function ClickHandler()
    {
        var nameValue = "";
        nameValue = locationValue = parent.Xrm.Page.getAttribute("name").getValue();   
       
        var test1 = "";
    }
     
    
    您应该按预期获得“Oliver”。
    然后返回竞争对手表单,用退格键手动删除文本。
    现在使用JavaScript阅读名称字段中的内容,就像前面所做的那样。
    除了“奥利弗”,你什么也得不到。
    现在在名称字段中输入Mark。
    用JavaScript读取字段,您会得到您应该得到的“标记”。
    因此,当在前一个值之后输入空值时,JavaScript会读取前一个值。
    换一种说法。如果名称字段有一个值,然后手动删除文本,则似乎存在问题。Page对象将不会更新为空字符串。但是,Xrm.Page对象将更新为非空值。



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

    这也张贴在

    如果文本字段没有失去焦点,Javascript无法读取该字段中的值。
    在“定期约会”表单上,我有一个运行Javascript的IFRAME。按下按钮时,它读取位置字段中的值。如果我将位置字段中的值更改为“Brunswick Street”,然后按下按钮,则不会读取任何内容(即,在下面的代码中,locationValue为null)。 但是,如果我将位置字段中的值更改为“Brunswick Street”。然后单击表单上IFRAME以外的其他位置,使位置字段失去焦点(在位置字段中输入文本后按enter/tab也可以实现这一点)。如果我按下IFRAME上的按钮,Javascript将正确读取位置字段中的文本。
    我推测这是因为parent.Xrm.Page只有在字段中失去焦点时才会更新

    function ClickHandler()
    {
        var locationValue = parent.Xrm.Page.getAttribute("location").getValue();
    }
    
    我尝试通过将JavaScript中的焦点设置为RequiredAttendes字段来更改焦点。但这并不奏效

    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时,不会为location字段触发On Change事件。
    到目前为止,唯一的解决方法是在单击触发Javascript的按钮之前单击另一个字段(或按enter/tab)


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

    以及如何在不丢失控件焦点的情况下执行javascript代码(在另一个onchange/onsave事件中)?用魔法?他执行了javascript代码,因此字段失去了焦点。不知道他在哪里执行了Xrm.Page.getAttribute(“subject”).getValue()语句。我已经在浏览器控制台中完成了这项工作,并重现了这个问题。在CRM 2011中,它可以通过功能区按钮脚本进行复制。当然,如果在浏览器控制台中执行,则会得到上一个值,因为该字段没有失去焦点,但在正常行为中,如果执行另一个onchange/onsave javascript代码,则始终会失去当前控件的焦点。因为他在另一个位置(或者对于同一控件的onchage)执行第二个getValue,并且他得到了这个值,这意味着字段失去了焦点,或者javascript根本不会执行。(正如他所说的,这种行为只发生在CRM 2013中,因为他在CRM 2011中也会发生同样的情况)我已经做到了