【问题标题】:How to implement Sitecore Template inheritance with Glass Mapper如何使用 Glass Mapper 实现 Sitecore 模板继承
【发布时间】:2017-01-11 17:16:56
【问题描述】:

我一直在尝试使用 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>();

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

有人知道我在这里缺少什么吗?!顺便说一句,我正在使用带有 .NET 4.5 的 Sitecore 7。

【问题讨论】:

  • 我不确定您是否可以在接口级别进行 AutoMap。尝试在接口属性上定义显式 [SitecoreField()] 属性并删除接口上的 AutoMap 属性。看看这是否有效。我还建议您使用 FieldId="" 映射到 GUID 而不是字段名称。
  • 您好 Ruud,感谢您的回复。我删除了自动映射并添加了 fieldid。什么都没有改变。我需要启用任何东西(配置或任何东西)吗?我觉得让它工作起来并不难,这似乎是一个非常基本的场景,但我不知道我在这里缺少什么。
  • 您是否正确设置了 Glass 的初始化,以便在启动时将所有模型加载到内存中?
  • 我会尝试复制您的问题并回复您。
  • 我试图复制您的问题,但模型适用于我的解决方案。您的模型与 Web 项目是否在不同的程序集中?如果是这样,请阅读此页面glass.lu/docs/tutorial/sitecore/tutorial20/tutorial20.html

标签: templates inheritance sitecore glass-mapper


【解决方案1】:

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

我认为 Homepage 类正在尝试将 Homepage 模板上的 NavigationTitle 与 fieldName NavigationTitle 进行映射,并忽略了基础模型上的 FieldName 属性。

顺便说一句:我只为我正在处理的当前项目使用接口,它可以按预期使用继承。无需多次添加属性;)

【讨论】:

    【解决方案2】:

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

    例如

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

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

    我发现没有这一套是不行的。

    【讨论】:

      【解决方案3】:

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

      public partial class NavigationTemplate : GlassUserControl<NavigationTemplate>
      {
      
          protected void Page_Load(object sender, EventArgs e)
      

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

      【讨论】:

        【解决方案4】:

        您似乎希望获取 HomePage 实例上的属性,但您需要询问包含该属性的确切接口,如 here 所示

        即 而不是这样做:

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

        您应该显式获取当前项目作为 INavigation 并从界面获取字段:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多