使用JavaScript在Dynamics CRM 2011中强制保存表单

使用JavaScript在Dynamics CRM 2011中强制保存表单,javascript,dynamics-crm-2011,Javascript,Dynamics Crm 2011,在CRM 2011中,我希望能够强制保存表单。我的要求如下 当用户打开表单时,我检查特定字段是否为空 如果它是空的,我想强制保存,从而触发一个插件来设置字段 我目前的代码如下。这在与LoadForm关联的FormOnLoad函数中 if(checkfield == null){ Namespace.Functions.Contact.FormOnSave(); } else{ // do nothing. } 现在,下面这行代码失败了 无法从已释放的脚本执行代码 我不知道如何进一步进行

在CRM 2011中,我希望能够强制保存表单。我的要求如下

  • 当用户打开表单时,我检查特定字段是否为空
  • 如果它是空的,我想强制保存,从而触发一个插件来设置字段 我目前的代码如下。这在与LoadForm关联的FormOnLoad函数中

    if(checkfield == null){
      Namespace.Functions.Contact.FormOnSave();
    }
    else{
     // do nothing. 
    }
    
    现在,下面这行代码失败了

    无法从已释放的脚本执行代码

    我不知道如何进一步进行。作为临时修复,我所做的如下

    if(checkfield == null){
      setTimeout('Namespace.Functions.Contact.FormOnSave()',4000);
    }
    else{
     // do nothing. 
    }
    
    任何关于为什么会发生这种情况以及如何在没有超时的情况下修复它的建议都会非常有用吗

    我已经看过了,但是在我的例子中,表单确实被加载了,或者实际上还没有加载


    无论哪种方式,我如何强制保存CRM表单?

    您可以使用以下方法保存表单:

    parent.Xrm.Page.data.entity.save();
    
    但只有在

    (Xrm.Page.data.entity.getIsDirty() == true)
    
    但是,有一种解决方法可以将IsDirty属性设置为true。 在PageLoad上运行Javascript函数。尝试更新您计划通过插件填充的字段的值:

    例如

    function OnPageLoad()
    {
        var yourField = Xrm.Page.getAttribute("new_yourfield").getValue();
        if(yourField == null)
        {
            parent.Xrm.Page.getAttribute("new_yourfield").setValue("any value");
            parent.Xrm.Page.getAttribute("new_yourfield").setSubmitMode("always");
            parent.Xrm.Page.data.entity.save();
        }
    }
    

    通过创建一个在读取或实体上注册的插件,使用Javascript两次加载表单,您可以跳过所有这些繁琐的操作。(或者更好,如果可能,在实体创建时)


    插件只需检查字段,如果字段为空,则执行您需要的任何逻辑来更新字段,然后保存它,并返回更新的字段(或者可能只是填充值,在用户执行保存之前不更新数据库)

    谢谢,我将查看Xrm.Page.data.entity.save()的选项但是这个插件有很多逻辑——从多个表中进行检查,然后在更新它之前派生一个值,而不是简单地更新布尔标志。好的,我想你只是想触发save以在表单加载时运行插件。