0

当我在编辑模式下打开 sitecore 页面时,我遇到了以下错误消息。任何想法似乎是什么问题。

我使用的是 Glass mapper fluent 配置,它适用于其他一些类。问题似乎只有一门课,我无法找出导致问题的原因。任何帮助,将不胜感激。

8384 13:46:48 错误无法在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object[] 参数,Object [] arguments) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture) 在 System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) 在 Glass。 Mapper.Sc.Configuration.SitecoreTypeConfiguration.ResolveItem(Object target, Database database) at Glass.Mapper.Sc.GlassHtml.MakeEditable[T](Expression 1 field, Expression1 standardOutput, T model, Object parameters, Context context, Database database, TextWriter writer) `

嵌套异常异常:System.Collections.Generic.KeyNotFoundException 消息:字典中不存在给定的键。来源: Sitecore.ContentSearch.SearchTypes.SearchResultItem.get_Item(String key) 的 Sitecore.ContentSearch.ContentSearch.SearchTypes.SearchResultItem.get_Version()

导致问题的代码。

查看渲染:

@using Glass.Mapper.Sc.Web.Mvc
@inherits GlassView<_RegionsCMS.Presentation.Models.InsightBaseModel>

<div class="nav-container">
<div class="page-nav" role="navigation">
    <h1 class="article-title">@Editable(model => model.Insight.Title)</h1>
</div>

控制器定义:

 var insight = _sitecoreContext.GetCurrentItem<Insights>();
        var model = new InsightBaseModel
        {
            Insight = insight
        };

        return View(model);

洞察类定义:

  public class Insights : SearchResultItem    {
    //Basic Information
    public virtual string Title { get; set; }}

流畅的配置:

public static IConfigurationLoader[] GlassLoaders(){
var attributes = new AttributeConfigurationLoader("Glass.Mapper.Sc"); 
var loader = new SitecoreFluentConfigurationLoader(); 
var config = loader.Add().AutoMap(); 
config.Id(x => x.ItemId); 
config.Info(x => x.Language).InfoType(SitecoreInfoType.Language); 
config.Info(x => x.Version).InfoType(SitecoreInfoType.Version); 
config.Info(x => x.Url).InfoType(SitecoreInfoType.Url); 
return new IConfigurationLoader[] {attributes ,loader }; 
}
4

2 回答 2

0

我能够解决这个问题。感谢大 T 的帮助提示。在我更新代码以从数据库而不是索引中读取对象后,它解决了问题。

   var insight = _sitecoreContext.GetCurrentItem<Insights>();
        var result = _Broker.GetInsightItem(insight);

GetInsightItem 方法定义如下:

var index = ContentSearchManager.GetIndex((SitecoreIndexableItem)ItemReferences.RootItem);
        var sitecoreService = new SitecoreService(Sitecore.Context.Database.Name);

        using (var context = index.CreateSearchContext())
        {
            var result = context.GetQueryable<Insights>()
                .FirstOrDefault(item => item.ItemId == insights.ItemId);
            sitecoreService.Map(result);
            return result;
        }
于 2014-11-06T21:17:34.960 回答
0

看起来您正在尝试从索引中读取,而不是从数据库中读取。请注意,并非所有字段都存储在索引中。您还应该注意,索引中的字段名称并不总是与 sitecore 中的名称匹配,因此您需要正确地使用属性来装饰[IndexField("<index field name>")]它们[TypeConverter(typeof(IndexFieldGuidValueConverter .. etc.))]

您已经提到您正在使用流体 Glass 配置,我猜上述解决方案是声明性映射器配置而不是流体,因此如果您想坚持使用这种方法,您需要将其移植到基于流体的配置。请注意,IndexField 是 Sitecore 原生装饰器,它与 Glass 无关,但我已经成功地将它们混合到我的 POCO 对象上,以使用相同的模型从 Index 和 DB 读取数据。我更喜欢基于序列化项目生成我的 POCO 类并以声明方式装饰它们。

我发现反汇编程序是找出正在发生的事情的最快方法之一。基于以下方法的反编译,在您的堆栈转储中,抛出异常 Glass 映射器正在尝试读取索引中不存在的字段。

// Sitecore.ContentSearch.SearchTypes.SearchResultItem
public virtual string this[string key]
{
    get
    {
        if (key == null)
        {
            throw new ArgumentNullException("key");
        }
        return this.fields[key.ToLowerInvariant()].ToString();
    }
    set
    {
        if (key == null)
        {
            throw new ArgumentNullException("key");
        }
        this.fields[key.ToLowerInvariant()] = value;
    }
}

我敢肯定,通过一些源分析,您应该能够识别出有问题的字段。尝试将它们一一移除,直到它起作用。查看 Lucene 索引的一个好工具是Luke。它丑陋但非常有效。

于 2014-11-06T08:41:59.203 回答