如何使用Glass Mapper实现Sitecore模板继承

时间:2013-10-24 14:13:31

标签: templates inheritance 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; }
}

当我尝试访问我的页面时,所有属性始终为null:

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

我尝试了几种不同的方法,但没有任何效果。此外,不同教程中描述的内容也不起作用。唯一有效的是当我直接在主页模板上添加字段时,但我不希望这样,因为我有多个页面类型,因此我想继承这些字段。

有谁知道我在这里缺少什么?!如果有所作为的话,我正在使用Sitecore 7和.NET 4.5。

4 个答案:

答案 0 :(得分:2)

您的字段未映射,因为您在Sitecore模板的“字段名称”中使用了空格。 删除空格或将属性[SitecoreField(FieldName ="Page Title")]添加到模型。

我认为Homepage类正在尝试使用fieldName NavigationTitle映射主页模板上的NavigationTitle,并忽略基本模型上的FieldName属性。

顺便说一句:我只使用我正在处理的当前项目的接口,它按预期的方式继承。不需要再添加一次属性;)

答案 1 :(得分:1)

尝试将推断类型设置为true。如果没有那套,我就无法让它工作。

离。

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

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

如果没有这套,我发现它不起作用。

答案 2 :(得分:0)

您应该将公共字段作为GlassUserControl呈现在单独的子布局中。

public partial class NavigationTemplate : GlassUserControl<NavigationTemplate>
{

    protected void Page_Load(object sender, EventArgs e)

无论您要加载什么项目,您都可以直接访问NavigationTemplate字段,它将始终转换为NavigationTemplate,并将读取您正在加载的项目的字段值。

答案 3 :(得分:0)

您希望获得HomePage实例上的属性,但是您需要询问包含该属性的确切接口here

即。 而不是做:

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

您应该明确地将当前项目作为INavigation获取并从界面获取字段:

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