public static IHtmlString MenuList(
this HtmlHelper helper,
ContentReference rootLink,
Func<MenuItem, HelperResult> itemTemplate = null,
bool includeRoot = false,
bool requireVisibleInMenu = true,
bool requirePageTemplate = true)
{
itemTemplate = itemTemplate ?? GetDefaultItemTemplate(helper);
var currentContentLink = helper.ViewContext.RequestContext.GetContentLink();
var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
Func<IEnumerable<PageData>, IEnumerable<PageData>> filter =
pages => pages.FilterForDisplay(requirePageTemplate, requireVisibleInMenu);
var pagePath = contentLoader.GetAncestors(currentContentLink)
.Reverse()
.Select(x => x.ContentLink)
.SkipWhile(x => !x.CompareToIgnoreWorkID(rootLink))
.ToList();
var menuItems = contentLoader.GetChildren<PageData>(rootLink)
.FilterForDisplay(requirePageTemplate, requireVisibleInMenu)
.Select(x => CreateMenuItem(x, currentContentLink, pagePath, contentLoader, filter))
.ToList();
if(includeRoot)
{
menuItems.Insert(0, CreateMenuItem(contentLoader.Get<PageData>(rootLink), currentContentLink, pagePath, contentLoader, filter));
}
var buffer = new StringBuilder();
var writer = new StringWriter(buffer);
foreach (var menuItem in menuItems)
{
itemTemplate(menuItem).WriteTo(writer);
}
return new MvcHtmlString(buffer.ToString());
}