我正在尝试从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
我不熟悉你的结构,但我在这里假设year
与contextItem
是同一类型。如果是这样,这将工作:
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的类,并将上面代码中的Months
和Articles
分别替换为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
};
}