Javascript 禁用/启用设定时间的功能区

Javascript 禁用/启用设定时间的功能区,javascript,plugins,dynamics-crm-2011,ribbon,Javascript,Plugins,Dynamics Crm 2011,Ribbon,我有一个用于联系人实体的插件,它在创建时触发。然后它调用WCF服务并在后台(MSSQL)中创建一个新记录。同一实体有另一个插件,在更新记录时触发 我遇到的问题是,如果我创建一个新记录,并在一分钟内更改详细信息并尝试保存它,更新插件就会失败。这是因为Create插件仍在运行。(我正在尝试更新的记录在后台数据库中仍然不存在) 当创建插件的状态未完成或失败时,是否有方法禁用功能区中的“保存”或“保存并关闭”按钮?或者至少禁用它120秒,这样它就不会马上被点击 CRM 2011 RU18内部部署。(所有

我有一个用于联系人实体的插件,它在创建时触发。然后它调用WCF服务并在后台(MSSQL)中创建一个新记录。同一实体有另一个插件,在更新记录时触发

我遇到的问题是,如果我创建一个新记录,并在一分钟内更改详细信息并尝试保存它,更新插件就会失败。这是因为Create插件仍在运行。(我正在尝试更新的记录在后台数据库中仍然不存在)

当创建插件的状态未完成或失败时,是否有方法禁用功能区中的“保存”或“保存并关闭”按钮?或者至少禁用它120秒,这样它就不会马上被点击

CRM 2011 RU18内部部署。(所有最终用户都被限制使用IE,因此我可以使用JS)

提前谢谢你,这是可能的

首先,您需要克隆save按钮,隐藏本机,在功能上添加本机和您需要的功能:一个调用js的禁用规则

在js中,您需要询问记录是否已创建,如果未创建,则按钮应为disable,否则为enable


您可以在javascript中提出更好的解决方案,询问记录是否已创建,如果未创建,请等待10秒或15秒,在创建记录时,启用“取消保存”按钮。

我的解决方案是让一些javascript在表单上等待,直到插件通过“完成”后才允许保存消息,在这种情况下可以保存表单。在插件代码的末尾,我会让它更新表单上的一个值,JavaScript会查看该值,如果该字段未填充,则不允许表单保存

JavaScript是使用onSave方法的简单部分,确保将execution对象作为第一个参数传递,并假设为插件创建一个bool字段

function preventSave(exobj)
{
  var pluginFinished = Xrm.Page.getAttribute("pluginFinished");

  if (pluginFinished.getValue() == false || pluginFinished.getValue() == null)
  {
    exobj.getEventArgs().preventDefault();
  }
}
如果没有值或null,JavaScript将不允许保存表单。您可能希望在preventDefault(防止保存)之后提供一条消息,提醒用户未进行保存


希望这有帮助

我试过你的方法,它确实有效。但是,用户体验受到影响,因为当创建插件运行时,用户无法保存记录。这就是我一开始想要的。但我尝试了其他方法,用户可以继续保存,但更新插件加入了队列,并等待创建插件完成。这就是我所做的

  • 创建了具有两个选项的字段,并将默认值设置为“进行中”。创建记录后,立即将值设置为“进行中”。(对)
  • 在数据传递到WCF服务之后添加了以下代码

        // Change Plugin Status flag value
    public void updatePluginStatus(Guid key, IServiceProvider serviceProvider, IPluginExecutionContext context)
    {
        IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        IOrganizationService service = factory.CreateOrganizationService(context.UserId);
        Entity contact = new Entity("contact");
        contact["contactid"] = key;
        OptionSetValue pluginStatus = new OptionSetValue();
        pluginStatus.Value = 0;
        contact["mw_plugin_status"] = false;
    
        service.Update(contact);
    }
    
  • 在我的更新插件中,我正在检查此标志的状态(插件状态),并保持循环,直到值变为false

                        while(checkPluginStatus(service, CrmKeyGuid) == true)
                    {
                        checkPluginStatus(service, CrmKeyGuid);
                    }
    
        //  Check Plugin Status
    public Boolean checkPluginStatus(IOrganizationService service, Guid key)
    {
    Boolean pluginStatus;
    ColumnSet flag = new ColumnSet(new string[] { "mw_plugin_status" });
    var contact = service.Retrieve("contact", key, flag);
    
        if ((bool)contact["mw_plugin_status"] == true)
    {
        pluginStatus = true;
    }
    else
    {
        pluginStatus = false;
    }
        return pluginStatus;
    }
    
  • 我现在唯一需要添加的是它在抛出异常和电子邮件之前循环的次数,记录数据以便手动修改

    我不是C#方面的专家,我的基本需求几乎可以满足,所以如果您看到这种逻辑中的任何流程,请告诉我


    非常感谢您的帮助:)

    Thank you@Jason Roberts问题是JavaScript如何知道我要检查插件的特定实例。例如,如果用户A创建联系人并触发插件(第一个),同时用户B创建新联系人并触发插件(第二个)。现在在用户A的联系人脚本中,我如何确保它没有等待用户B的联系人创建?天啊,我希望我说的有道理。有点道理,哈哈,你可能需要进一步澄清,但如果我认为我得到了它的jist。插件将为每个记录单独启动,因此可能会同时创建10条记录,这意味着您的插件将启动10次。如果您在第一个插件中包含一段代码来更新“pluginFinished”字段,JavaScript将不允许保存,其他插件将不受影响。我希望这是有意义的,并且回答了你想问的问题?谢谢你,这唤起了人们的希望!:)明天早上第一件事就是尝试。太好了,希望它能帮助解决你的问题,如果你还有问题,请给我留言,如果它能解决你的答案,请勾选我的答案。愉快的一天在任务列表中添加了一些其他内容(像往常一样,紧急!!!),所以我必须在开始之前完成这些内容。我会让你们知道它是如何进行的:)谢谢@Sxntk,因为我们有大量使用Ribbon的第三方解决方案,我们尽量避免在Ribbon区域进行任何更改。如果什么都不起作用,我可能至少会设置一个红绿灯样式的指示器,让用户知道他们的进程正在后台运行。当我的解决方案起作用时,我会让您知道;)顺便说一句,第一块代码在Create插件中。