在 Sitecore 中过滤 Sitecore 子项

Filter in Sitecore Children in Sitecore

我有这个树结构:

Page1
  PageA
    PageX
    PageY
  PageB
Page2

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

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

在其他 ItemModel 中 class 获取子页面

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

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

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

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

您可以在 parent 模型上使用 SitecoreQuery

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

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

或者您可以在 SideMenuModel class:

上使用 EnforceTemplate 属性
[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的项目,否则将被跳过。

如果您需要映射 children 的 children 那么您应该在 SideMenuModel class 上添加 [SitecoreChildren] 属性(或者重构您的代码,以便 class 引用自身)或者您可以使用“获取所有后代查询 (.//*[@@templateid={SideMenuModel-GUID}]),尽管我建议您此时使用内容搜索 API。

您可以在博客 post 中阅读有关 Getting child items with Glass 的更多信息。