Glass Mapper -ERROR无法渲染字段

时间:2014-11-05 21:41:39

标签: c# sitecore glass-mapper

我在编辑模式下打开sitecore页面时遇到以下错误消息。知道什么似乎是问题。

我使用的是Glass mapper流畅的配置,它可以用于其他几个类。问题似乎只有一个课程,我无法找出导致问题的原因。任何帮助将不胜感激。

  

8384 13:46:48错误无法渲染字段   System.RuntimeMethodHandle.InvokeMethod(Object target,Object []   arguments,Signature sig,Boolean constructor)       at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object [] parameters,Object [] arguments)       在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,   文化信息文化)       在System.Reflection.RuntimePropertyInfo.GetValue(Object obj,Object [] index)       在Glass.Mapper.Sc.Configuration.SitecoreTypeConfiguration.ResolveItem(Object   目标,数据库数据库)       在Glass.Mapper.Sc.GlassHtml.MakeEditable [T](表达式1 field, Expression 1 standardOutput,T模型,对象参数,上下文   context,Database database,TextWriter writer)`

     

嵌套异常       例外:System.Collections.Generic.KeyNotFoundException       消息:给定的密钥不在字典中。       来源:Sitecore.ContentSearch       at Sitecore.ContentSearch.SearchTypes.SearchResultItem.get_Item(String   键)       在Sitecore.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 }; 
}

2 个答案:

答案 0 :(得分:0)

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

你已经提到你正在使用流体玻璃配置,我猜上面的解决方案是一个声明性的映射器配置而不是流畅的,所以如果你想坚持这种方法,你需要将它移植到基于流体的配置。请注意,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。它丑陋但效率很高。

答案 1 :(得分:0)

我能够解决问题。感谢Big 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;
        }