Help shape the future of CMS PaaS release notes! Take this quick survey and share your feedback.
AI OnAI Off
Help shape the future of CMS PaaS release notes! Take this quick survey and share your feedback.
I imagine this helper is only built for a single level, you'd have to create your own navigation code if you want to go multiple levels.
Here's some example recursive naviagation code for when you want to build a nested menu. You can then pass this through to razor script and write your markup round it
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using EPiServer;
using EPiServer.Core;
using EPiServer.Filters;
namespace Appius.EPI.Core.Helpers
{
/// <summary>
/// Helper for working with core navigation
/// </summary>
public class NavigationHelper
{
private readonly IContentLoader _ContentLoader;
/// <summary>
/// Initializes a new instance of the <see cref="NavigationHelper"/> class.
/// </summary>
public NavigationHelper(IContentLoader ContentLoader)
{
_ContentLoader = ContentLoader;
}
/// <summary>
/// Gets the navigation for the core pages.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="ParentPageContentReference">The parent page content reference.</param>
/// <param name="IncludeParentPage">if set to <c>true</c> [include parent page].</param>
/// <param name="Level">The level.</param>
/// <returns>The navigation</returns>
public IList<NavigationViewModel> GetNavigation<T>(ContentReference ParentPageContentReference, bool IncludeParentPage = true, int Level = 1) where T: PageData, INavigationPage
{
var pageList = new List<NavigationViewModel>();
var currentPage = PageExtensions.GetCurrentPage();
if (IncludeParentPage)
{
var parentPageModel = _ContentLoader.Get<T>(ParentPageContentReference);
pageList.Add(PopulateNavigationViewModel<T, NavigationViewModel>(parentPageModel, currentPage));
}
var recursiveNavigation = GetRecursiveNavigation<T>(ParentPageContentReference, currentPage, Level, 1);
pageList.AddRange(recursiveNavigation);
return pageList;
}
/// <summary>
/// Gets the recursive navigation.
/// </summary>
/// <typeparam name="T">The type of the page</typeparam>
/// <param name="PageContentReference">The page content reference.</param>
/// <param name="CurrentPage">The current page.</param>
/// <param name="Level">The level we want to go to.</param>
/// <param name="CurrentLevel">The current level.</param>
/// <returns></returns>
private IList<NavigationViewModel> GetRecursiveNavigation<T>(ContentReference PageContentReference, PageData CurrentPage, int Level, int CurrentLevel) where T : PageData, INavigationPage
{
var pageList = new List<NavigationViewModel>();
var childPages = _ContentLoader.GetChildren<T>(PageContentReference);
var filteredChildPages = FilterForVisitor.Filter(childPages).Cast<T>().Where(p => p.VisibleInMenu);
foreach (var filteredChildPage in filteredChildPages)
{
var viewModel = PopulateNavigationViewModel<T, NavigationViewModel>(filteredChildPage, CurrentPage);
if (Level > CurrentLevel)
{
viewModel.ChildNavigation = GetRecursiveNavigation<T>(viewModel.Reference, CurrentPage, Level, CurrentLevel + 1);
viewModel.IsDescendantNavigationCurrentPage = viewModel.ChildNavigation.Any(cn => cn.IsCurrentPage);
}
pageList.Add(viewModel);
}
return pageList;
}
/// <summary>
/// Populates the navigation view model.
/// </summary>
/// <typeparam name="TPageModel">The type of the page</typeparam>
/// <typeparam name="TNavigationViewModel">The type of the navigation view model.</typeparam>
/// <param name="PageModel">The page model.</param>
/// <param name="CurrentPage">The current page.</param>
/// <returns>The navigation view model</returns>
private TNavigationViewModel PopulateNavigationViewModel<TPageModel, TNavigationViewModel>(TPageModel PageModel, PageData CurrentPage)
where TPageModel : PageData, INavigationPage
where TNavigationViewModel : NavigationViewModel
{
var model = Activator.CreateInstance<TNavigationViewModel>();
model.Name = PageModel.Title;
model.Url = ContentExtensions.GetUrl(PageModel.ContentLink, false);
model.IsCurrentPage = CurrentPage.PageLink.ID == PageModel.ContentLink.ID;
model.Reference = PageModel.ContentLink;
return model;
}
}
}
Hi All,
We are doing mikgration from DNN to EPiserver while doing migration main navigation is coming but subnav and submenu not loading. what is the steps to follow?
Mainnav code:
@Html.MenuList(SiteDefinition.Current.StartPage,
@<li class="@(item.Selected ? "active" : null)">
@Html.PageLink(item.Page, null, new { @class = string.Join(" ", item.Page.GetThemeCssClassNames()) })
</li>)