Javascript 禁用/启用设定时间的功能区
我有一个用于联系人实体的插件,它在创建时触发。然后它调用WCF服务并在后台(MSSQL)中创建一个新记录。同一实体有另一个插件,在更新记录时触发 我遇到的问题是,如果我创建一个新记录,并在一分钟内更改详细信息并尝试保存它,更新插件就会失败。这是因为Create插件仍在运行。(我正在尝试更新的记录在后台数据库中仍然不存在) 当创建插件的状态未完成或失败时,是否有方法禁用功能区中的“保存”或“保存并关闭”按钮?或者至少禁用它120秒,这样它就不会马上被点击 CRM 2011 RU18内部部署。(所有最终用户都被限制使用IE,因此我可以使用JS) 提前谢谢你,这是可能的 首先,您需要克隆save按钮,隐藏本机,在功能上添加本机和您需要的功能:一个调用js的禁用规则 在js中,您需要询问记录是否已创建,如果未创建,则按钮应为disable,否则为enableJavascript 禁用/启用设定时间的功能区,javascript,plugins,dynamics-crm-2011,ribbon,Javascript,Plugins,Dynamics Crm 2011,Ribbon,我有一个用于联系人实体的插件,它在创建时触发。然后它调用WCF服务并在后台(MSSQL)中创建一个新记录。同一实体有另一个插件,在更新记录时触发 我遇到的问题是,如果我创建一个新记录,并在一分钟内更改详细信息并尝试保存它,更新插件就会失败。这是因为Create插件仍在运行。(我正在尝试更新的记录在后台数据库中仍然不存在) 当创建插件的状态未完成或失败时,是否有方法禁用功能区中的“保存”或“保存并关闭”按钮?或者至少禁用它120秒,这样它就不会马上被点击 CRM 2011 RU18内部部署。(所有
您可以在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(防止保存)之后提供一条消息,提醒用户未进行保存
希望这有帮助我试过你的方法,它确实有效。但是,用户体验受到影响,因为当创建插件运行时,用户无法保存记录。这就是我一开始想要的。但我尝试了其他方法,用户可以继续保存,但更新插件加入了队列,并等待创建插件完成。这就是我所做的
// 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);
}
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;
}
非常感谢您的帮助:)Thank you@Jason Roberts问题是JavaScript如何知道我要检查插件的特定实例。例如,如果用户A创建联系人并触发插件(第一个),同时用户B创建新联系人并触发插件(第二个)。现在在用户A的联系人脚本中,我如何确保它没有等待用户B的联系人创建?天啊,我希望我说的有道理。有点道理,哈哈,你可能需要进一步澄清,但如果我认为我得到了它的jist。插件将为每个记录单独启动,因此可能会同时创建10条记录,这意味着您的插件将启动10次。如果您在第一个插件中包含一段代码来更新“pluginFinished”字段,JavaScript将不允许保存,其他插件将不受影响。我希望这是有意义的,并且回答了你想问的问题?谢谢你,这唤起了人们的希望!:)明天早上第一件事就是尝试。太好了,希望它能帮助解决你的问题,如果你还有问题,请给我留言,如果它能解决你的答案,请勾选我的答案。愉快的一天在任务列表中添加了一些其他内容(像往常一样,紧急!!!),所以我必须在开始之前完成这些内容。我会让你们知道它是如何进行的:)谢谢@Sxntk,因为我们有大量使用Ribbon的第三方解决方案,我们尽量避免在Ribbon区域进行任何更改。如果什么都不起作用,我可能至少会设置一个红绿灯样式的指示器,让用户知道他们的进程正在后台运行。当我的解决方案起作用时,我会让您知道;)顺便说一句,第一块代码在Create插件中。