1

更新: Sitecore バージョン 7.0 を使用しています

私はこれまで Glass.Mapper.Sc を使用して成功しています。多くのモデルが正常にマッピングされています。最初のクエリ マッピングを試したところ、うまくいきません。

私は次の2つのモデルを持っています

[SitecoreType(TemplateName = "Testimonial")]
public class Testimonial : ContentItem
{
    [SitecoreField(FieldType = SitecoreFieldType.MultiLineText)]
    public virtual string Summary { get; set; }

    [SitecoreField(FieldType = SitecoreFieldType.RichText)]
    public virtual string Testimony { get; set; }

    [SitecoreField]
    public virtual string Testifier { get; set; }

    [SitecoreField(FieldType = SitecoreFieldType.GeneralLink)]
    public virtual Link TestifierUrl { get; set; }

    [SitecoreField]
    public virtual string Company { get; set; }

}

[SitecoreType(TemplateName = "Testimonials")]
public class Testimonials : ContentFeatureItem
{
    public Testimonials()
    {
        TestimonialList = new List<Testimonial>();
    }

    [SitecoreQuery("/sitecore/content//*[@@templatename='Testimonial']", IsRelative = true)]
    public virtual IEnumerable<Testimonial> TestimonialList { get; set; }
}

チュートリアルによると、TestimonialList に Testimonial アイテムのリストが入力されることを期待する必要があります。ただし、リストは常に空です。

sitecore の Developer Tools で XPath ビルダーを使用し、次の Sitecore API を使用して、パスが有効であることを確認しました。

var query = new Query("/sitecore/content//*[@@templateName='Testimonial']");
var returnVal = query.Execute();

returnVal には、予想されるアイテムが入力されます。./*[@@templateName='Testimonial']マッピング属性のクエリとしても試しました。

特定の Testimonial インスタンスを手動で取得して、奇妙なマッピングの問題ではないことを確認しました。

この問題は別として、Glass.Mapping.Sc と私のモデルではすべてが正しく機能しているようです。これまでのところ、 glass.lu のチュートリアルに従い、NuGet経由で Glass.Mapping.Sc をインストールしました。

github のソースを調べましたが、問題の原因となっている可能性のあるものは何も見つかりません。他の誰かがこの問題を抱えていたり、ガラスでクエリが入力されたパラメーターを正常に使用したりしましたか?

更新 (Michael の返信に続いて):
Testimonials クラスに次のプロパティを追加しました

[SitecoreQuery("./*")]
public virtual IEnumerable<AbstractModel> Children { get; set; }

これにより、Testimonials アイテムの直接の子である 6 つの Testimonial アイテムである AbstractModel のデータが取り込まれた IEnumerable が返されました。

私も試しました

[SitecoreQuery("//*")]
public virtual IEnumerable<AbstractModel> Children { get; set; }

そして同じ結果を得ました。6つの証言よりも多くのアイテムを手に入れることを期待しているので、私はそれを理解していません.

TestimonialList プロパティを削除し、新しいプロパティ Children を追加しました。このプロパティは完全に機能します

[SitecoreQuery("./*[@@templatename='Testimonial']", IsRelative = true)]        
public virtual IEnumerable<Testimonial> Children { get; set; }      

次に、resharper を使用してプロパティの名前を TestimonialList、ZYX、Blerg に変更しました。3 回とも機能しませんでした (入力されませんでした) が、名前を Children に戻すと、すべて問題ありません。変。

詳細更新 プロパティの名前が「Children」の場合にクエリが機能しているように見える理由がわかりました。うまくいかないので、予期しない結果が得られました。「Children」は、すべての Child アイテムに設定される共通のプロパティです。子アイテムはすべて Testimonials であるため、正しく入力できます。

したがって、プロパティを次のように変更しても、正しく入力されます

public virtual IEnumerable<Testimonial> Children { get; set; } 

Glass.Mapper.Sc.Integration.DataMappers.SitecoreChildrenMapperFixture.MapToProperty_ItemHasThreeChildren_ThreeObjectsAreCreated で見られます。

4

2 に答える 2

5

クエリは相対クエリではないため、属性を次のように更新する必要があります。

[SitecoreQuery("/sitecore/content//*[@@templatename='Testimonial']")]
public virtual IEnumerable<Testimonial> TestimonialList { get; set; }

IsRelative を削除すると、Glass はソリューションのルートからクエリを実行します。デフォルトでは、IsRelative フラグは false です。

IsRelative は、クエリが Glass によって読み込まれている現在のアイテムに関連していることを示すために使用されます。たとえば、ニュースのランディング ページがあり、機能フラグを持つニュース ページの子のみを取得したい場合は、次のようにします。

[SitecoreQuery("./*[@featured='1']", IsRelative=true)]
public virtual IEnumerable<News> FeaturedNews { get; set; }

これで IsRelative フラグの使用法が説明されていることを願っています。それでわからない場合は、Glass サイトのブログ記事を書きます。

于 2013-06-19T06:42:55.957 に答える
0

問題が見つかりました (Glass Mapper のソースを数時間かけて検索した後、少なくとも Glass Mapper についていくつかのことを学びました :))。しばらく前にアセンブリの名前を変更しましたが、{{SitecoreAttributeConfigurationLoader}} に渡される名前を変更していませんでした。

その名前を変更しても、まだ機能しないので、bin フォルダーから古い dll を削除し、PC を再起動して、デスクの周りで数回踊りながら仕事を唱えました。仕事!仕事!何度も何度も(最後のビットは作成されました)。

その後、すべて正常に動作します。

于 2013-06-19T23:53:53.287 に答える