【问题标题】:Disable/Enable Ribbon for set time禁用/启用功能区设置时间
【发布时间】:2015-04-14 14:35:30
【问题描述】:

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

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

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

CRM 2011 RU18 内部部署。 (所有终端用户只能使用IE,所以我可以使用JS)

提前谢谢你,

【问题讨论】:

    标签: javascript plugins dynamics-crm-2011 ribbon


    【解决方案1】:

    我对此的解决方案是在表单上等待一些 JavaScript,并且在您的插件传递“完整”消息之前不允许它保存,在这种情况下可以保存表单。在您的插件代码接近尾声时,我会让它更新您的表单上的一个值,JavaScript 会查看该值,如果未填充此字段,则不允许保存表单。

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

    function preventSave(exobj)
    {
      var pluginFinished = Xrm.Page.getAttribute("pluginFinished");
    
      if (pluginFinished.getValue() == false || pluginFinished.getValue() == null)
      {
        exobj.getEventArgs().preventDefault();
      }
    }
    

    如果没有值或 null,JavaScript 将不允许保存表单。您可能希望在 preventDefault(防止保存)之后提供一条消息,以提醒用户未发生保存。

    希望对你有帮助

    【讨论】:

    • 谢谢@Jason Roberts 问题是 JavaScript 如何知道我想要检查插件的特定实例。例如,如果用户 A 创建联系人并触发插件(第一个),同时用户 B 创建一个新联系人并且也触发插件(第二个)。现在在用户 A 的联系人的脚本中,我如何确保它不等待用户 B 的联系人创建?上帝,我希望我说得通。
    • 有道理,有点大声笑,你可能需要进一步澄清,但如果我认为得到了它的要点。该插件将为每条记录单独触发,因此可能同时创建 10 条记录,这意味着您的插件将单独触发 10 次。如果您在第一个插件中包含一段代码来更新“pluginFinished”字段,JavaScript 将不允许保存,其他插件不会受到影响。我希望这是有道理的,并且正在回答您要问的问题?谢谢
    • 知道了,这带来了希望! :) 明天早上会先尝试这个。
    • 太好了,希望它能帮助并解决您的问题,如果您有任何问题,请给我留言,如果它解决了您的答案,请勾选我的答案。祝你有美好的一天
    • 在任务列表中添加了其他内容(一如既往,紧急!!!)所以在我开始之前必须完成它。我会让你知道它是怎么回事:)
    【解决方案2】:

    这是可能的。

    首先你需要克隆保存按钮,隐藏native,添加native功能和你需要的功能:调用js的禁用规则。

    在js中你需要询问是否创建了记录,如果没有,按钮应该禁用,否则启用。

    您可以在javascript中提出更好的解决方案,询问是否创建了记录,如果没有,请等待10或15秒,您想要的时间,创建记录时,启用de save按钮。

    【讨论】:

    • 感谢@Sxntk,因为我们有大量使用功能区的第三方解决方案,所以我们尽量远离功能区区域的任何变化。如果没有任何效果,我至少可以在交通灯样式指示器上让用户知道他们是在后台运行的进程。我会在可行时告诉您我的解决方案;)
    【解决方案3】:

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

    1. 创建的字段有两个选项,并将默认值设置为“进行中”。创建记录后,该值现在设置为进行中。 (真)
    2. 在将数据传递到 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);
      }
      
    3. 在我的更新插件中,我正在检查此标志的状态(插件状态)并继续循环,直到值更改为 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# 专家,我只是想摆脱我的基本需求,所以如果你看到这个逻辑中的任何流程,请告诉我。

    非常感谢您的帮助:)

    【讨论】:

    • 顺便说一句,第一块代码在 Create 插件中。
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2022-10-17
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多