2017-09-13 58 views
0

我有这样的树形结构:过滤器在Sitecore的

Page1 
    PageA 
    PageX 
    PageY 
    PageB 
Page2 

我想1和Page 2,以及所有子页面。我创建了两个类。在一类使用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

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

您可以使用上一个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的项目,否则它们将被跳过。

如果你需要映射,那么你应该在你的SideMenuModel类添加[SitecoreChildren]财产以及孩子的孩子(或重构你的代码,因此类引用本身),或者你可以使用“获取所有后代查询(.//*[@@templateid={SideMenuModel-GUID}])虽然我会建议你在这一点上他内容搜索API

你可以在博客中看到更多关于Getting child items with Glass的信息