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

时间:2015-04-12 06:27:20

标签: dynamics-crm-2013

我必须在“Artilce”实体上的快速查找搜索中注册一个插件。当用户在Article实体的快速查找文本框中输入任何内容时,我的插件执行并返回基于我们的业务逻辑过滤数据。  1.当我们发现使用快速查找时会发生什么事件。  2.触发此事件时会传递什么消息。

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

请帮忙。

2 个答案:

答案 0 :(得分:0)

我们在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;
        }
 }

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

答案 1 :(得分:0)

我们已经向微软提出了一张票,以解决这种情况。 他们提供的解决方案是修改数据库以生成消息 插件注册工具中提供了 SearchByTitleKbArticleRequest

我目前还不记得我们针对这些消息更新了一个标志的表。

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

<强> SearchByTitleKbArticleRequest

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