private static void RenderSubNavigationLevel( HtmlHelper helper, ContentReference levelRootLink, IEnumerable<ContentReference> path, IContentLoader contentLoader) { //Retrieve and filter the pages on the current level var children = contentLoader.GetChildren<PageData>(levelRootLink); children = FilterForVisitor.Filter(children) .OfType<PageData>() .Where(x => x.VisibleInMenu); if (!children.Any()) { //There's nothing to render on this level so we abort //in order not to write an empty ul element. return; } var writer = helper.ViewContext.Writer; //Open list element for the current level writer.WriteLine("<ul class=\"nav\">"); //Project to an anonymous class in order to know //the index of each page in the collection when //iterating over it. var indexedChildren = children .Select((page, index) => new { index, page }) .ToList(); foreach (var levelItem in indexedChildren) { var page = levelItem.page; var partOfCurrentBranch = path.Any(x => x.CompareToIgnoreWorkID(levelItem.page.ContentLink)); if (partOfCurrentBranch) { //We highlight pages that are part of the current branch, //including the currently viewed page. writer.WriteLine("<li class=\"active\">"); } else { writer.WriteLine("<li>"); } writer.WriteLine(helper.PageLink(page).ToHtmlString()); if (partOfCurrentBranch) { //The page is part of the current pages branch, //so we render a level below it RenderSubNavigationLevel( helper, page.ContentLink, path, contentLoader); } writer.WriteLine("</li>"); } //Close list element writer.WriteLine("</ul>"); }