Как реализовать наследование шаблонов Sitecore с помощью Glass Mapper

Я пытался добиться следующего с помощью Glass Mapper, но не могу заставить его работать.

У меня есть шаблон домашней страницы, который не имеет полей, но наследует следующие два шаблона:

Navigation Template

Fields: Navigation Title

Meta Information Template

Fields: Page Title, Meta Description

Я создал соответствующие интерфейсы/классы следующим образом:

[SitecoreType(TemplateId = "{5BAB563C-12AD-4398-8C4A-BF623F7DBCDC}", AutoMap = true)]
public interface INavigation
{
    [SitecoreField(FieldName = "Navigation Title")]
    string NavigationTitle { get; set; }
}

[SitecoreType(TemplateId = "{95539498-31A5-4CB5-8DD6-C422D505C482}", AutoMap = true)]
public interface IMetaInformation
{
    [SitecoreField]
    string PageTitle { get; set; }

    [SitecoreField]
    string MetaDescription { get; set; }
}

[SitecoreType(TemplateId = "{F08693E5-8660-4B13-BBD6-7B9DC6091750}", AutoMap = true)]
public class HomePage : INavigation, IMetaInformation
{
    public virtual string NavigationTitle { get; set; }

    public virtual string PageTitle { get; set; }

    public virtual string MetaDescription { get; set; }
}

Когда я затем пытаюсь получить доступ к своей странице, все атрибуты всегда равны нулю:

var context = new SitecoreContext();
var page = context.GetCurrentItem<HomePage>();

Я пробовал несколько разных подходов к этому, но ничего не работает. Также то, что было описано в разных туториалах, не работало. Единственное, что работает, — это когда я добавляю поля непосредственно в шаблон домашней страницы, но мне это не нужно, поскольку у меня более одного типа страницы, и поэтому я хочу наследовать поля.

Кто-нибудь знает, что мне здесь не хватает?! Кстати, я использую Sitecore 7 с .NET 4.5, если это имеет значение.


person 5earch    schedule 24.10.2013    source источник
comment
Я не уверен, что вы можете использовать AutoMap на уровне интерфейса. Попробуйте определить явные атрибуты [SitecoreField()] в свойствах интерфейса и удалите свойство AutoMap в интерфейсах. Посмотрите, работает ли это. Я также предлагаю вам использовать FieldId= для сопоставления с GUID вместо имен полей.   -  person Ruud van Falier    schedule 24.10.2013
comment
Привет Рууд, спасибо за ваш ответ. Я удалил автокарту и вместо этого добавил идентификатор поля. Однако ничего не изменилось. Нужно ли мне что-то включать (конфиги или что-то еще)? Я чувствую, что заставить это работать несложно, кажется довольно простым сценарием, но я понятия не имею, чего мне здесь не хватает.   -  person 5earch    schedule 24.10.2013
comment
Вы правильно настроили инициализацию Glass, чтобы он загружал все модели в память при запуске?   -  person Ruud van Falier    schedule 24.10.2013
comment
Я постараюсь воспроизвести вашу проблему и вернуться к вам.   -  person Michael Edwards    schedule 24.10.2013
comment
Я попытался воспроизвести вашу проблему, но модели работали над моим решением. Ваши модели находятся в сборке, отличной от веб-проекта? Если это так, прочитайте эту страницу glass.lu/docs/tutorial/sitecore/tutorial20/tutorial20. .html   -  person Michael Edwards    schedule 24.10.2013
comment
@Mike Я также столкнулся с проблемой с учебником № 2. На снимке экрана показано поле с именем Main Body, которое не будет сопоставляться со свойством C# с именем MainBody, как следует из руководства.   -  person Dan Solovay    schedule 25.10.2013
comment
@MichaelEdwards Гений! Спасибо, что воспроизвели ошибку вместе со мной. У меня действительно есть модели в другой сборке. Ваше решение устранило проблему. Меня действительно сбило с толку то, что это сработало, когда я объявил поле в шаблоне напрямую, а не по наследству. Я ожидал, что это сработает все или ничего :) Спасибо всем за вашу помощь, очень ценю это!   -  person 5earch    schedule 25.10.2013
comment
@MichaelEdwards Есть ли что-то, что я должен учитывать при использовании PageEditor? Значение отображается, когда я не в PageEditor. Когда я нахожусь в PageEditor, я не получаю рамку редактирования и никакого значения, просто пустое поле. Есть идеи, чего может не хватать? Я использую @Editable(x =› x.NavigationTitle)   -  person 5earch    schedule 25.10.2013
comment
@ user2668680 вам удалось решить эту проблему? Я не вижу принятого ответа или решения, опубликованного в ветке.   -  person Umeshwali    schedule 30.05.2014


Ответы (4)


Ваши поля не сопоставлены, потому что вы используете пробел в имени поля в шаблоне Sitecore. Либо удалите пробел, либо добавьте атрибут [SitecoreField(FieldName ="Page Title")] в Модель.

Я думаю, что класс Homepage пытается сопоставить NavigationTitle в шаблоне Homepage с fieldName NavigationTitle и игнорирует атрибут FieldName в базовой модели.

Кстати: я использую только интерфейсы для текущего проекта, над которым я работаю, и он работает, как и ожидалось, с наследованием. Нет необходимости добавлять свойство более одного раза ;)

person Martijn van der Put    schedule 24.10.2013

Попробуйте установить для типа вывода значение true. Я не могу заставить его работать вообще без этого набора.

ex.

item.GlassCast<HomePage>(false, true);

or

context.GetCurrentItem<HomePage>(false, true);

Я считаю, что это не работает без этого набора.

person Davan Etelamaki    schedule 06.02.2014

Вы должны визуализировать общие поля в отдельном подмакете как GlassUserControl.

public partial class NavigationTemplate : GlassUserControl<NavigationTemplate>
{

    protected void Page_Load(object sender, EventArgs e)

Здесь у вас будет прямой доступ к полям NavigationTemplate независимо от того, какой элемент вы загружаете, он всегда будет приведен к NavigationTemplate и будет считывать значения полей загружаемого вами элемента.

person GUstavo    schedule 14.05.2015

Кажется, вы ожидаете получить свойства экземпляра HomePage, но вам нужно запросить точный интерфейс, который содержит свойство, как видно здесь

т.е. Вместо того, чтобы делать:

var page = context.GetCurrentItem<HomePage>();

Вы должны явно получить текущий элемент как INavigation и получить поле из интерфейса:

var navigationTitle = context.GetCurrentItem<INavigation>().NavigationTitle;
person VilladsR    schedule 11.01.2017