用LINQ构建中继器分层导航



我正在尝试从CMS输出项目的分层导航列表,如下所示:

YEAR
- MONTH
- - ARTICLE 1
- - ARTICLE 2

这个页面是模板化的,所以如果你在年份页面,你会看到:

MONTH
- ARTICLE 1
- ARTICLE 2

显然,如果你在每月的页面你只会看到文章的链接

我试图建立一个LINQ查询来处理逻辑,然后在一个由中继器处理的数据表中构建它。我真的在努力获得逻辑声音,这样我就可以以正确的方式构建它。从逻辑上讲,LINQ似乎是最简单的建模方法,尽管我现在有了新的想法。这是我编写的代码,用于获取到目前为止的年份和必要的数据。

var linqYears = from year in contextItem.Children
                select new
                {
                    Name = year.Fields["page title"],
                    URI = Sitecore.Links.LinkManager.GetItemUrl(year)
                };

我现在需要的是得到选定年份的所有月份,然后是所有的文章,并将它们构建成一个中继器;我认为最简单的方法是通过一个数据表/数据集?

任何帮助都将是非常感激的。

编辑:澄清我的立场:

itemcontextitem是我当前所在的页面。如果我在根页面和年份页面在我下面,那么上下文项。child将返回它下面的所有子节点。例如,如果我在ROOT目录下:

ROOT
- YEAR
- - MONTH
- - - ARTICLE 1
- - - ARTICLE 2

然后contextItem。Children将是仅由YEAR

组成的集合

我不熟悉你的结构,但我在这里假设yearcontextItem是同一类型。如果是这样,这将工作:

var linqYears = from year in contextItem.Children
                select new
                {
                    Name = year.Fields["page title"],
                    URI = Sitecore.Links.LinkManager.GetItemUrl(year),
                    Months = from month in year.Children
                             select new
                             {
                                 Name = month.Fields["page title"],
                                 URI = Sitecore.Links.LinkManager.GetItemUrl(month),
                                 Articles = from article in month.Children
                                            select new
                                            {
                                                Name = article.Fields["page title"],
                                                URI = Sitecore.Links.LinkManager.GetItemUrl(article)
                                            }
                             }
                };

我不确定的重复,但你有没有考虑使用一个ListView代替?如果我没记错的话,你可以把它直接绑定到你的匿名类型。当然,这只适用于内联选择。否则,我建议创建一个包含Name, URI和Children的类,并将上面代码中的MonthsArticles分别替换为Children

希望对你有帮助。

编辑:

无论您在层次结构中的当前位置如何,都可以使此解决方案工作,您可以这样做:

首先为您的页面创建一个类。

public class PageNode
{
    public string Name { get; set; }
    public Uri URI { get; set; }
    public List<PageNode> Children { get; set; } // This should be done with a private setter, but you get that...
}

那么你需要类似这样的方法:

public IEnumerable<PageNode> GetChildNodes(IEnumerable<ContextItem> children)
{
    return from c in children
           select new PageNode()
           {
               Name = c.Fields["page name"],
               URI = Sitecore.Links.LinkManager.GetItemUrl(c),
               Children = c.Children.Any() ? GetChildNodes(c.Children) : null
           };
}
public PageNode LoadNode(ContextItem item)
{
    return new PageNode()
           {
               Name = item.Fields["page name"],
               URI = Sitecore.Links.LinkManager.GetItemUrl(item),
               Children = item.Children.Any() ? GetChildNodes(item.Children) : null
           };
}

相关内容

  • 没有找到相关文章

最新更新