D365虚拟实体:Lookup输入筛选时插件无法获取筛选条件
如何在插件中获取Lookup搜索时的筛选条件
Lookup弹窗触发的检索请求与高级查找的参数结构存在差异,常规从InputParameters["Query"]获取筛选条件的方式并不适用,可通过以下方法处理:
1. 确认插件注册的消息与上下文参数
- 确保插件注册在目标虚拟实体的
RetrieveMultiple消息上(Lookup搜索直接检索虚拟实体数据,而非Case实体)。 - 先输出执行上下文的所有输入参数,明确参数的实际键名:
Lookup场景下,筛选条件通常封装在// 调试时打印所有输入参数 foreach (var key in context.InputParameters.Keys) { Trace.WriteLine($"InputParameter: {key} = {context.InputParameters[key]}"); }FetchXml参数中,而非Query(QueryExpression)。
2. 解析FetchXml获取筛选逻辑
如果上下文存在FetchXml参数,直接解析该XML提取筛选条件:
if (context.InputParameters.Contains("FetchXml")) { string fetchXml = context.InputParameters["FetchXml"].ToString(); // 使用XDocument解析FetchXml的筛选节点 var fetchDoc = XDocument.Parse(fetchXml); var filterElements = fetchDoc.Descendants(XName.Get("filter", "http://schemas.microsoft.com/xrm/2011/Contracts")); // 遍历filter节点处理具体筛选条件 }
3. 处理直接输入的搜索文本
当用户在Lookup输入框直接输入文本搜索时,筛选条件可能通过SearchText参数传递:
if (context.InputParameters.Contains("SearchText")) { string searchKeyword = context.InputParameters["SearchText"].ToString(); // 根据关键词匹配虚拟实体的对应字段 }
4. 识别Lookup请求来源
可通过上下文的MessageProperties判断请求是否来自Lookup弹窗,针对性处理:
if (context.MessageProperties.TryGetValue("IsLookup", out object isLookupObj) && (bool)isLookupObj) { // 执行Lookup专属的筛选参数解析逻辑 }
额外注意事项
- 虚拟实体的自定义Connector需确保正确传递Lookup的筛选参数到插件执行上下文,避免参数丢失。
- 调试时使用Plugin Registration Tool的Profiler捕获完整上下文,确认参数的实际存在形式。
内容的提问来源于stack exchange,提问作者amar bisht
相关产品推荐
相关产品推荐

