我有一个在Create上触发的Contact实体插件。然后它调用WCF服务并在后台(MSSQL)中创建新记录。同一实体有另一个插件,在更新记录时触发。
我遇到的问题是,如果我创建新记录并在一分钟内更改细节并尝试保存,则更新插件将失败。这是因为Create插件仍在运行。 (我试图更新的记录在后台DB中仍然不存在)
有没有办法禁用'保存'或'保存&当Create插件的状态未完成或失败时,关闭功能区中的'按钮?或者至少禁用120秒,以便不立即点击它?
CRM 2011 RU18 On Premise。 (所有最终用户都限制使用IE,因此我可以使用JS)
提前谢谢你,
答案 0 :(得分:2)
我的解决方案是让一些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(阻止保存)之后提供一条消息,以警告用户没有发生保存。
希望这有帮助
答案 1 :(得分:0)
有可能。
首先,您需要克隆保存按钮,隐藏本机,在功能上添加本机以及您需要的功能:一个调用js的禁用规则。
在js中你需要询问是否创建了记录,如果不是,则应禁用该按钮,否则启用。
你可以在javascript中找出更好的解决方案,询问是否创建了记录,如果没有,等待10或15秒,你想要的时间,创建记录时,启用de save按钮。
答案 2 :(得分:0)
我尝试了你的方式它确实有效。但是,用户体验受到影响,因为创建插件运行时用户无法保存记录。这首先是我想要的。但是我尝试了其他用户可以继续保存的东西,但更新插件加入队列并等待Create插件完成。这就是我做的。
在将数据传递给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#的专家,只是为了逃避我的基本需求所以如果你看到这个逻辑中的任何流程,请告诉我。
非常感谢你的帮助:)。