Disable/Enable 设定时间的彩带

Disable/Enable Ribbon for set time

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

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

有没有办法在创建插件的状态不是完成或失败时禁用功能区中的 'Save' 或 'Save & Close' 按钮?或者至少将其禁用 120 秒,这样它就不会立即被点击?

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

提前谢谢你,

有可能。

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

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

您可以在 javascript 询问记录是否已创建,如果没有,请等待 10 或 15 秒,在您想要的时间,当记录创建时,启用 de save 按钮。

我的解决方案是让一些 JavaScript 等待表单,直到您的插件传入 "complete" 消息才允许它保存,在这种情况下可以保存表单。在您的插件代码快要结束时,我会让它更新您表单上的一个值,JavaScript 会查看该值,如果此字段未填充,则不允许保存表单。

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

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

  if (pluginFinished.getValue() == false || pluginFinished.getValue() == null)
  {
    exobj.getEventArgs().preventDefault();
  }
}

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

希望对您有所帮助

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

  1. 创建了带有两个选项的字段并将默认值设置为 'In Progress'。一旦创建了记录,该值就会立即设置为 In Progress。 (真)
  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# 方面的专家,只是满足了我的基本需求,所以如果您看到此逻辑中的任何流程,请告诉我。

非常感谢您的帮助:)