2013-06-19 7 views
1

обновления: Я использую Sitecore версию 7.0Sitecore Glass Mapper (v3) для запроса собственности на основании не заполняется

Я использую Glass.Mapper.Sc с успехом до сих пор. У меня есть ряд моделей, которые успешно отображаются. Теперь я просто попробовал свое первое сопоставление запросов и не могу заставить его работать.

У меня есть следующие две модели

[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 заполняться со списком Благодарственное пунктов. Однако список всегда пуст.

Я проверил, что путь действителен как с помощью XPath-конструктора в Инструментах разработчика sitecore, так и с помощью использования API Sitecore.

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

Где returnVal заполняется ожидаемыми предметами. Я также попробовал ./*[@@templateName='Testimonial'] как запрос атрибута сопоставления.

Я успешно вручную извлек конкретный экземпляр Testimonial, чтобы проверить, что это не какая-то странная проблема с отображением.

Этот вопрос в стороне, все, кажется, работает правильно с Glass.Mapping.Sc и моими моделями. До сих пор я следил за учебниками по glass.lu, и я установил Glass.Mapping.Sc через NuGet.

Я посмотрел источник на github, но не вижу ничего, что может вызвать мою проблему. Кто-нибудь еще имел эту проблему или успешно использовал запрошенные заполненные параметры со стеклом?

UPDATE (После ответа Майкла):
Я добавил следующее свойство к классу Отзывов

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

Возвращаемому населенная IEnumerable из AbstractModel, которые были на 6 пунктов Благодарственных, которые являются прямыми потомками Пункт отзывов.

Я также попытался

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

и получил тот же результат. Я не понимаю этого, потому что я бы ожидал получить гораздо больше предметов, чем только 6 отзывов.

Я удалил свойство TestimonialList и добавили новое свойство, детей, и это свойство работает отлично

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

Затем я использовал ReSharper переименовать свойство TestimonialList, а затем ZYX, затем Blerg. Все три раза это не сработало (не заполняло), но если я переименую обратно в Children, все будет в порядке. Странный.

Подробнее Обновление Я выяснил, почему запрос работал, когда свойство называется «Дети». Это не работает, и я получаю неожиданные результаты.«Дети» - это общее свойство, которое заполнено всеми Детскими предметами. Поскольку все мои дочерние элементы являются рекомендациями, это может быть правильно заполнено.

Так что, если я изменю свое имущество только после него все еще правильно заселена

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

Seen в Glass.Mapper.Sc.Integration.DataMappers.SitecoreChildrenMapperFixture.MapToProperty_ItemHasThreeChildren_ThreeObjectsAreCreated.

ответ

5

Ваш запрос не относительный запрос поэтому вам необходимо обновить атрибут этого:

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

Удаление IsRelative означает, что стекло будет запрашивать от корня раствора. По умолчанию флаг IsRelative имеет значение false.

IsRelative используется, чтобы указать, что запрос относится к текущему элементу, загружаемому стеклом. Например, если у меня есть страница Новостей посадки, и я хотел бы получить только ребенок страницы новостей, который имел особенность флаг я мог бы сделать это:

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

Я надеюсь, что это объясняет использование IsRelative флага, если он не дает мне знать, и я напишу сообщение в блоге для сайта Glass.

+0

Извините за путаницу. Сначала я попробовал относительный путь "./*[@@templateName='Testimonial ']", как говорится в другом месте моего сообщения. Я попробовал это с установкой IsRelative в true. Полный путь был проверен с IsRelative false и true и не работал. Относительный запрос тоже не работает. Я также попытался использовать очень общий тип и открытый запрос Xpath (например, «// *») и вернуть шаблон базового шаблона, и это тоже не сработало. –

0

Я нашел свою проблему (потратив несколько часов на поиск источника Glass Mapper - по крайней мере, я узнал кое-что о Glass Mapper :)). Я переименовал свою сборку некоторое время назад, и я не изменил имя, переданное в {{SitecoreAttributeConfigurationLoader}}.

Как только я изменил это имя, я все еще не мог заставить его работать, поэтому я удалил старую dll из папки bin, перезапустил компьютер и немного пошутил за столом! Работа! Работа! снова и снова (нормально, что последний бит был составлен).

После этого все работает нормально.

+0

Итак, у вас больше нет проблемы? –