在 Sitecore 中过滤 Sitecore 中的子项

问题描述 投票:0回答:1

我有这个树结构:

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; }
}

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

sitecore glass-mapper
1个回答
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
属性(或重构您的代码,以便类引用自身),或者您可以使用“获取所有后代查询(
.//*[@@templateid={SideMenuModel-GUID}]
)”尽管我建议您此时使用 Content Search API。

您可以在博客文章中阅读有关 使用 Glass 获取子项目的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.