0

編集モードでサイトコア ページを開くと、以下のエラー メッセージが表示されます。何が問題と思われるか。

Glass マッパーの流暢な構成を使用していましたが、他のいくつかのクラスでは正常に機能しています。問題は 1 つのクラスだけにあるようで、問題の原因を特定できませんでした。どんな助けでも大歓迎です。

8384 13:46:48 エラー System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object [] 引数) で System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder バインダー, Object[] パラメータ, CultureInfo カルチャ) で System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] インデックス) で 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(文字列キー) の Sitecore.ContentSearch.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 }; 
}
4

2 に答える 2

0

データベースではなく、インデックスから読み込もうとしているようです。すべてのフィールドがインデックスに格納されるわけではないことに注意してください。また、インデックス内のフィールド名がサイトコア内の名前と常に一致するとは限らないことにも注意してください。したがって、それらを属性で正しく装飾する必要が[IndexField("<index field name>")]あります。[TypeConverter(typeof(IndexFieldGuidValueConverter .. etc.))]

流動的な Glass 構成を使用していると述べましたが、上記のソリューションは流動的ではなく宣言的なマッパー構成であると思います。そのため、そのアプローチを維持したい場合は、流動ベースの構成に移植する必要があります。IndexField は、Glass とは関係のない Sitecore のネイティブ デコレーターであることに注意してください。ただし、同じモデルを使用して Index と DB の両方からデータを読み取るために、POCO オブジェクトにそれらを混在させることに成功しました。シリアル化されたアイテムに基づいて POCO クラスを生成し、宣言的に装飾することを好みます。

逆アセンブラーは、何が起こっているのかを知るための最速の方法の 1 つです。メソッドの以下の逆コンパイルに基づいて、スタック ダンプで、例外がスローされ、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;
    }
}

ソース分析を行うことで、問題のあるフィールドを特定できるはずです。機能するまで、それらを 1 つずつ削除してみてください。Lucene インデックスの内部を調べるのに適したツールはLukeです。その醜いが非常に効率的です。

于 2014-11-06T08:41:59.203 に答える
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;
        }
于 2014-11-06T21:17:34.960 に答える