2013-10-24 2 views
2

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

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

Navigation Template

Fields: Navigation Title

Meta Information Template

Fields: Page Title, Meta Description

I Созданы соответствующие интерфейсы/cla ГСЭС следующим образом:

[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, если это имеет значение.

+0

Я не уверен, если вы можете автокарта на уровне интерфейса. Попробуйте определить явные атрибуты [SitecoreField()] для свойств интерфейса и удалить свойство AutoMap на интерфейсах. Посмотрите, работает ли это. Я также предлагаю вам использовать FieldId = "" для сопоставления с идентификаторами GUID вместо имен полей. –

+0

Привет Рууд, Спасибо за ваш ответ. Я удалил automap и вместо этого добавил fieldid. Однако ничего не изменилось. Нужно ли мне активировать что-либо (конфиги или что-то еще)? Я чувствую, что не может быть трудно заставить это работать, похоже на довольно простой сценарий, но я не знаю, что мне здесь не хватает. – 5earch

+1

Правильно ли вы настроили инициализацию Glass, чтобы загружать все модели в память при запуске? –

ответ

2

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

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

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

1

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

ex.

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

или

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

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

0

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

public partial class NavigationTemplate : GlassUserControl<NavigationTemplate> 
{ 

    protected void Page_Load(object sender, EventArgs e) 

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

0

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

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

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

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

var navigationTitle = context.GetCurrentItem<INavigation>().NavigationTitle;