我在编辑模式下打开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 };
}
答案 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;
}