SitecoreIdMapper 不支持Coveo.UI.Components.Models.IBaseComponentProperties.Id

问题描述 投票:0回答:1

我刚刚接触与 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 是模块,并且应该是可配置的。我确定必须有一些我可以配置的东西来纠正这个问题?这些都是非常常见的模块,这难道是以前见过的吗?!

有人能指出我正确的方向吗?

sitecore glass-mapper coveo
1个回答
0
投票

经过一段时间的项目研究。我发现一些自定义代码只是将 Coveo IBaseComponentProperty 对象直接传递到玻璃映射器中。所以答案就是要确定GUID的类型。获取 IBaseComponentProperty 的字符串并使用字符串数据更新 GUID。因为 coveo 会将 GUID 存储在该字符串中。

新的 Guid(CoveoObj.Id);

不幸的是,这些模型之间的切换发生的位置因项目而异。所以你需要解决这个部分。但他的答案是确保该字符串被解析为 GUID。否则,当 GlassMapper 的反射查找失败时,将触发 NotSupportedExpection。

© www.soinside.com 2019 - 2024. All rights reserved.