在 Dynamics CRM 2013 中快速查找注册插件

Registering plugin on quick find in Dynamics CRM 2013

我必须在 "Artilce" 实体的快速查找搜索中注册一个插件。当用户在文章实体的快速查找文本框中输入任何内容时,我的插件会执行并 return 根据我们的业务逻辑过滤数据。 1.What 当我们使用快速查找查找时会触发事件。 2.What 触发此事件时消息传递。

我已经尝试在 RetrieveMultiple 消息上注册插件,但是当我们在快速查找中单击搜索时,这并没有被触发。

请帮忙。

我们在 RetrieveMultiple 上注册了一个插件。我们有搜索记录的业务需求,默认使用 WildCard。

插件注册详情:

Message: RetrieveMultiple

Primary Entity:None

Secondary Entity:None

Pre-Operation

代码:

public const String QueryLiteral = "Query";
    public const String LIKE = "%";
    public void Execute(IServiceProvider serviceProvider)
    {
        String ParentEntity = String.Empty;
        String OriginalSearch = String.Empty;

        // Obtain the execution context from the service provider. 
        var ContextInstance = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        // Get a reference to the Organization service. 
        IOrganizationService ServiceInstance =
            ((IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory))).
                CreateOrganizationService(ContextInstance.InitiatingUserId);
        // Critical Point here - NOTICE that the InputParameters Contains the word Query
        if (ContextInstance.Depth < 2 && ContextInstance.InputParameters.Contains(QueryLiteral) &&
               ContextInstance.InputParameters[QueryLiteral] is QueryExpression)
        {
            QueryExpression QueryPointer = (ContextInstance.InputParameters[QueryLiteral] as QueryExpression);
            //Verify the conversion worked as expected - if not, everything else is useless
            if (null != QueryPointer)
            {
                // Check if the request is coming from any Search View 
                // We know this b/c Criteria isn't null and the Filters Count > 1
                if (null != QueryPointer.Criteria && QueryPointer.Criteria.Filters.Count > 1)
                {
                    ParentEntity = ContextInstance.PrimaryEntityName;
                    OriginalSearch = QueryPointer.Criteria.Filters[1].Conditions[0].Values[0].ToString();
                    OriginalSearch = String.Format(CultureInfo.CurrentCulture,
                                     "{0}{1}", LIKE, OriginalSearch);
                }
                ConditionExpression NewCondition = null;
                FilterExpression NewFilter = null;
                if (null != QueryPointer.Criteria)
                {
                    //Change the default 'BeginsWith'Operator to 'Contains/Like' operator in the basic search query
                    foreach (FilterExpression FilterSet in QueryPointer.Criteria.Filters)
                    {
                        foreach (ConditionExpression ConditionSet in FilterSet.Conditions)
                        {
                            if (ConditionSet.Operator == ConditionOperator.Like)
                            {
                                if (OriginalSearch != "")
                                    ConditionSet.Values[0] = OriginalSearch;
                                else
                                {
                                    OriginalSearch = QueryPointer.Criteria.Filters[0].Conditions[0].Values[0].ToString();
                                    OriginalSearch = String.Format(CultureInfo.CurrentCulture,
                                                     "{0}{1}", LIKE, OriginalSearch);
                                    ConditionSet.Values[0] = OriginalSearch;

                                }
                            }
                        }
                    }
                }
            }
            ContextInstance.InputParameters[QueryLiteral] = QueryPointer;
        }
 }

查看此 Post 的详细信息:http://www.williamgryan.mobi/?p=596

我们已向 Microsoft 提出申请以解决此问题。 他们提供的解决方案是修改数据库使消息 SearchByTitleKbArticleRequest 在插件注册工具中可用。

我目前不记得 table 我们针对这些消息更新了标记。

更新 table 后,我们可以根据消息注册插件

SearchByTitleKbArticleRequest

然后插件触发,我们修改了从那里返回的实体集合。