在Sitecore中过滤Sitecore中的儿童

时间:2017-09-13 17:53:32

标签: sitecore glass-mapper

我有这种树结构:

Page1
  PageA
    PageX
    PageY
  PageB
Page2

我想要Page1和Page2以及所有子页面。我创建了两个类。在一个使用sitecore查询的类中

[SitecoreQuery("../*[@@templateid={GUID}]", IsRelative = true)]
public virtual IEnumerable<ItemModel> Links { get; set; }

在获取子页面的其他ItemModel类中

public class ItemModel
{
    [SitecoreId]
    public Guid Id { get; set; }

    [SitecoreChildren]
    public IEnumerable<SideMenuModel> Children { get; set; }
}

这工作正常,但现在我想只获得那些具有某些特定模板的子页面。请给我一些解决方案。

1 个答案:

答案 0 :(得分:2)

看起来您的大部分代码都是正确的,但您还需要对Children类的ItemModel属性应用限制。

您可以在父模型上使用SitecoreQuery

public class ItemModel
{
    [SitecoreId]
    public Guid Id { get; set; }

    [SitecoreQuery("./*[@@templateid={SideMenuModel-GUID}]", IsRelative = true)]
    public virtual IEnumerable<SideMenuModel> ChildItems { get; set; }
}

或者您可以使用EnforceTemplate课程中的SideMenuModel属性:

[SitecoreType(TemplateId = "GUID", EnforceTemplate = SitecoreEnforceTemplate.Template)]
public class SideMenuModel
{
    [SitecoreId]
    public Guid Id { get; set; }
}

public class ItemModel
{
    [SitecoreId]
    public Guid Id { get; set; }

    [SitecoreChildren]
    public virtual IEnumerable<SideMenuModel> ChildItems { get; set; }
}

由于您已设置EnforceTemplate,因此使用[SitecoreChildren]属性意味着只会返回与模板ID匹配的项目,否则将跳过它们。

如果您需要映射子项的子项,那么您应该在[SitecoreChildren]类上添加SideMenuModel属性(或重构您的代码,以便类引用自身),或者您可以使用&#34;得到所有后代查询(.//*[@@templateid={SideMenuModel-GUID}])虽然我建议您在此时使用内容搜索API。

您可以在博客文章中阅读有关Getting child items with Glass

的更多信息