我刚刚接触与 Sitecore 集成的 Coveo 搜索。我发生了一个奇怪的异常,我无法弄清楚为什么会发生这种情况。当导航到带有 Coveo 组件的搜索页面时。我看到这个异常。
**The type Coveo.UI.Components.Models.IBaseComponentProperties on Coveo.UI.Components.Models.IBaseComponentProperties.Id is not supported by SitecoreIdMapper
Description: An unhandled exception occurred.**
Exception Details: System.NotSupportedException: The type Coveo.UI.Components.Models.IBaseComponentProperties on Coveo.UI.Components.Models.IBaseComponentProperties.Id is not supported by SitecoreIdMapper
Source Error:
Line 3:
Line 4: <div class="coveo-results-header">
Line 5: @Html.Sitecore().CoveoDynamicPlaceholder("coveo-ui-results-header-section")
Line 6: </div>
[NotSupportedException: The type Coveo.UI.Components.Models.IBaseComponentProperties on Coveo.UI.Components.Models.IBaseComponentProperties.Id is not supported by SitecoreIdMapper]
Glass.Mapper.Sc.DataMappers.SitecoreIdMapper.Setup(DataMapperResolverArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper.Sc\DataMappers\SitecoreIdMapper.cs:66
Glass.Mapper.Pipelines.DataMapperResolver.Tasks.DataMapperStandardResolverTask.Execute(DataMapperResolverArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\DataMapperResolver\Tasks\DataMapperStandardResolverTask.cs:30
Glass.Mapper.Pipelines.<>c__DisplayClass9_1.<.ctor>b__1(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:55
Glass.Mapper.Pipelines.AbstractPipelineTask`1.Next(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineTask.cs:33
Glass.Mapper.Pipelines.DataMapperResolver.Tasks.DataMapperAttributeResolverTask.Execute(DataMapperResolverArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\DataMapperResolver\Tasks\DataMapperAttributeResolverTask.cs:34
Glass.Mapper.Pipelines.<>c__DisplayClass9_0.<.ctor>b__0(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:65
Glass.Mapper.Pipelines.AbstractPipelineRunner`2.Run(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:77
Glass.Mapper.Context.ProcessProperties(IEnumerable`1 properties) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Context.cs:204
Glass.Mapper.Context.Load(IConfigurationLoader[] loaders) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Context.cs:176
Glass.Mapper.Pipelines.ConfigurationResolver.Tasks.OnDemandResolver.ConfigurationOnDemandResolverTask`1.Execute(ConfigurationResolverArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\ConfigurationResolver\Tasks\OnDemandResolver\ConfigurationOnDemandResolverTask.cs:26
Glass.Mapper.Pipelines.<>c__DisplayClass9_1.<.ctor>b__1(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:55
Glass.Mapper.Pipelines.AbstractPipelineTask`1.Next(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineTask.cs:33
Glass.Mapper.Pipelines.AbstractPipelineTask`1.Execute(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineTask.cs:27
Glass.Mapper.Pipelines.ConfigurationResolver.Tasks.StandardResolver.ConfigurationStandardResolverTask.Execute(ConfigurationResolverArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\ConfigurationResolver\StandardResolver\ConfigurationStandardResolverTask.cs:23
Glass.Mapper.Pipelines.<>c__DisplayClass9_1.<.ctor>b__1(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:55
Glass.Mapper.Pipelines.AbstractPipelineTask`1.Next(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineTask.cs:33
Glass.Mapper.Pipelines.AbstractPipelineTask`1.Execute(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineTask.cs:27
Glass.Mapper.Sc.Pipelines.ConfigurationResolver.TemplateInferredTypeTask.Execute(ConfigurationResolverArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper.Sc\Pipelines\ConfigurationResolver\TemplateInferredTypeTask.cs:60
Glass.Mapper.Pipelines.<>c__DisplayClass9_1.<.ctor>b__1(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:55
Glass.Mapper.Pipelines.AbstractPipelineTask`1.Next(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineTask.cs:33
Glass.Mapper.Pipelines.AbstractPipelineTask`1.Execute(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineTask.cs:27
Glass.Mapper.Sc.Pipelines.ConfigurationResolver.SitecoreItemResolverTask.Execute(ConfigurationResolverArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper.Sc\Pipelines\ConfigurationResolver\SitecoreItemResolverTask.cs:36
Glass.Mapper.Pipelines.<>c__DisplayClass9_0.<.ctor>b__0(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:65
Glass.Mapper.Pipelines.AbstractPipelineRunner`2.Run(T args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\Pipelines\AbstractPipelineRunner.cs:77
Glass.Mapper.AbstractService.RunConfigurationPipeline(AbstractTypeCreationContext abstractTypeCreationContext) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\AbstractService.cs:163
Glass.Mapper.AbstractService.InstantiateObject(AbstractTypeCreationContext abstractTypeCreationContext) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper\AbstractService.cs:126
Glass.Mapper.Sc.SitecoreService.RunCreateType(Item item, GetOptions options, Dictionary`2 parameters) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper.Sc\SitecoreService.cs:349
Glass.Mapper.Sc.SitecoreService.GetItem(GetItemOptions options) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper.Sc\SitecoreService.cs:338
Glass.Mapper.Sc.Pipelines.Response.GetModelFromView.GetDataSourceItem(GetModelArgs args, Type modelType) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper.Sc.Mvc\Pipelines\Response\GetModelFromView.cs:174
Glass.Mapper.Sc.Pipelines.Response.GetModelFromView.Process(GetModelArgs args) in D:\a\Glass.Mapper\Glass.Mapper\Source\Glass.Mapper.Sc.Mvc\Pipelines\Response\GetModelFromView.cs:82
(Object , Object ) +54
Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) +1268
Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain, Boolean failIfNotExists) +236
Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain) +22
Sitecore.Mvc.Pipelines.PipelineService.RunPipeline(String pipelineName, TArgs args) +195
Sitecore.Mvc.Pipelines.PipelineService.RunPipeline(String pipelineName, TArgs args, Func`2 resultGetter) +161
Sitecore.Mvc.Presentation.Rendering.GetModel() +316
Sitecore.Mvc.Presentation.Rendering.get_Model() +31
Sitecore.Mvc.Extensions.ObjectExtensions.ValueOrDefault(T source, Func`2 resultGetter) +51
Sitecore.Mvc.Presentation.ViewRenderer.get_Model() +163
Sitecore.Mvc.Presentation.ViewRenderer.Render(TextWriter writer) +160
当我查看 DLL 时,我看到 IBaseComponentProperties.cs 看起来像这样
namespace Coveo.UI.Components.Models
{
public interface IBaseComponentProperties
{
string Id { get; }
string CssClass { get; }
string PlaceholderId { get; }
string ItemId { get; }
bool HasDataSource { get; }
}
}
此 ID 是 string
类型当我查看 SitecoreIdMapper.cs 时,我看到了这个:
namespace Glass.Mapper.Sc.DataMappers
{
public class SitecoreIdMapper : AbstractDataMapper
{
private Func<Item, object> _getValue;
public SitecoreIdMapper() => this.ReadOnly = true;
public override void MapToCms(AbstractDataMappingContext mappingContext) => throw new NotImplementedException();
public override object MapToProperty(AbstractDataMappingContext mappingContext) => this._getValue(((SitecoreDataMappingContext) mappingContext).Item);
public override void Setup(DataMapperResolverArgs args)
{
if (args.PropertyConfiguration.PropertyInfo.PropertyType == typeof (Guid))
this._getValue = (Func<Item, object>) (item => (object) item.ID.Guid);
else if (args.PropertyConfiguration.PropertyInfo.PropertyType == typeof (ID))
this._getValue = (Func<Item, object>) (item => (object) item.ID);
else
throw new NotSupportedException("The type {0} on {0}.{1} is not supported by SitecoreIdMapper".Formatted((object) args.PropertyConfiguration.PropertyInfo.ReflectedType.FullName, (object) args.PropertyConfiguration.PropertyInfo.Name));
base.Setup(args);
}
public override bool CanHandle(AbstractPropertyConfiguration configuration, Context context) => configuration is SitecoreIdConfiguration;
}
}
因此,SitecoreIdMapper 似乎需要 PropertyType 的 GUID 或 ID,并且由于它是一个字符串,因此它落入 else 子句中,在该子句中引发了不支持的异常..
由于 Coveo for Sitecore 和 GlassMapper for Sitecore 是模块,并且应该是可配置的。我确定必须有一些我可以配置的东西来纠正这个问题?这些都是非常常见的模块,这难道是以前见过的吗?!
有人能指出我正确的方向吗?
经过一段时间的项目研究。我发现一些自定义代码只是将 Coveo IBaseComponentProperty 对象直接传递到玻璃映射器中。所以答案就是要确定GUID的类型。获取 IBaseComponentProperty 的字符串并使用字符串数据更新 GUID。因为 coveo 会将 GUID 存储在该字符串中。
新的 Guid(CoveoObj.Id);
不幸的是,这些模型之间的切换发生的位置因项目而异。所以你需要解决这个部分。但他的答案是确保该字符串被解析为 GUID。否则,当 GlassMapper 的反射查找失败时,将触发 NotSupportedExpection。