我一直在尝试使用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。
答案 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;