在 CRM 2015 中区分页面加载和导出到 Excel

Distinguish page load and Export to Excel in CRM 2015

我正在编写一个插件,当用户按下 "Export to Excel" 按钮时将被触发。我目前正在将它连接到 "RetrieveMultiple" 消息。但是,加载页面时也会触发相同的消息。无论如何,我可以区分页面加载消息和 "Export to Excel" 消息吗?

遗憾的是,SDK 中没有用于导出到 Excel 的特殊消息,您可以根据该消息注册您的插件。我可以想到两个选项:

  1. 覆盖应用程序功能区中的导出到 Excel 按钮以调用自定义 JavaScript 函数。您的函数将做您想做的任何事情,然后可选择将请求传递给正常的 Export to Excel 函数。
  2. 找到一些方法来区分 RetrieveMultiple 消息(正如您正在尝试做的那样)。
    • 下载 CRM Snoop, install it in your org, register it against RetrieveMultiple for your entity, turn it on (basic usage),然后触发导出到 excel。这将使查看 RetrieveMultiple 请求并检查其所有属性变得非常容易。四处寻找,看看是否有任何东西让您跳出来,可以让您将其区分为 excel 的导出。我不怀疑你会找到任何东西,但绝对值得一试。
    • 旁注,我有点惊讶 CRM 没有像导出报告和图表那样绕过插件执行管道以导出到 excel。

按照 Polshgiant 的建议,我安装了 CRM Snoop,发现页面加载和导出到 excel 之间存在 3 个差异。

  • 在页面加载时,上下文深度为 1,而在导出到 excel 时,上下文深度为 2。
  • 在页面加载时,ParentContext 为空,而在导出到 excel 时,ParentContext 不为空并且包含以下参数:"View"、"FetchXml"、"LayoutXml" , "QueryApi", "QueryParameters".
  • 导出到excel时,ParentContext的消息明确标注为"ExportToExcel"。

利用这些差异,我已经能够在并且仅在导出到 excel 事件时触发我的插件。

您可以在为 RetrieveMultiple 注册的插件中使用 ExportToExcel 和 ExportDynamicToExcel "virtual" 消息:

public void Execute(IServiceProvider serviceProvider)
{
    var executionContext = serviceProvider.GetService<IPluginExecutionContext>();
    var parentContext = executionContext.ParentContext;
    if (parentContext != null &&
        (parentContext.MessageName == "ExportToExcel" ||
         parentContext.MessageName == "ExportDynamicToExcel"))
    {
        // Place your logic here
    }
}