为什么我的PostUpdateOrder插件执行两次CRM 2013

时间:2017-03-09 14:41:44

标签: javascript dynamics-crm-2013

用户验证订单后,订单状态设置如此验证并发送到另一个系统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;
    } 

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)内。