用户验证订单后,订单状态设置如此验证并发送到另一个系统X,问题是插件在某些情况下会被解雇,甚至超过两次,导致发送此订单实体多次到系统X.我试图通过使用context.depth来纠正它,但所有时间都等于1.
JS方法:
Validate: function () {
Xrm.Page.getAttribute("eoz_validated").setValue(true);
Xrm.Page.data.entity.save();
ABE.Order.HideVisibleField();
Xrm.Page.ui.clearFormNotification('ProductError');
}
}
插件执行方法:
protected void ExecutePostOrderUpdate(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
if (localContext.PluginExecutionContext.Depth > 1)
{
return;
}
tracingService = localContext.TracingService;
var order = (Entity)localContext.PluginExecutionContext.InputParameters["Target"];
bool isValidated = order.GetAttributeValue<OptionSetValue>("abe_isValidated").Value : false;
if (isValidated )
{
SendToSystemX(localContext.OrganizationService, order.Id);
SendProductsToOwner(localContext.OrganizationService, order.Id);
}
var statecode = order.Contains("statecode") ? order.GetAttributeValue<OptionSetValue>("statecode").Value : -1;
}
答案 0 :(得分:1)
如果您的插件已注册,可在更新"eoz_validated"
时触发,并且还会更新"eoz_validated"
,那么您可以拥有无限的执行循环。
为避免这种情况,在更新上下文实体之前,请重新实例化它:
var updatedEntity = new Entity { LogicalName = context.LogicalName, Id = context.Id };
这将删除原本已更新的所有属性,例如上下文实体中包含的"eoz_validated"
。请注意,在代码中,您将上下文实体存储在名为order
的变量中。
我只是在这里猜测(并且没有50个声望来提问)。如果您的代码中发生了这种情况,那么可能会在SendToSystemX(IOrganizationService, Guid)
或SendProductsToOwner(IOrganizationService, Guid)
内。