我必须在“Artilce”实体上的快速查找搜索中注册一个插件。当用户在Article实体的快速查找文本框中输入任何内容时,我的插件执行并返回基于我们的业务逻辑过滤数据。 1.当我们发现使用快速查找时会发生什么事件。 2.触发此事件时会传递什么消息。
我已经尝试在RetrieveMultiple消息上注册插件,但是当我们在快速查找中点击搜索时,这不会被触发。
请帮忙。
答案 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 强>
然后触发了插件,我们修改了从那里返回的实体集合。