Как отобразить одноуровневые пункты меню в объекте меню в DDRMenu

Я работаю с nav.cshtml в DDRMenu DNN. На страницах этого веб-сайта я хотел бы отобразить меню в верхней части страницы, в котором отображаются только дочерние страницы текущей страницы, если они есть, а если нет, то страницы-близнецы текущей страницы.

Вот код:

@using DotNetNuke.Web.DDRMenu;
@using System.Dynamic;
@inherits DotNetNuke.Web.Razor.DotNetNukeWebPage<dynamic>

@{
 var root = Model.Source.root;
}

@helper RenderNodes(IList<MenuNode> nodes)
{
if (nodes.Count > 0)
{
  <ul class="navbar-nav ml-auto">
   @foreach (var node in nodes)
   {
    String isActive = "";
    string isDisabled = "";
    if (node.Selected) { isActive = "active"; }
    if (!node.Enabled) { isDisabled = "disabled"; }

    if (node.HasChildren())
    {
     <li class="nav-item parent">
      <a href="@node.Url" class="@isActive @isDisabled nav-link">@node.Text</a>
      <button class="submenuButton" onclick="$(this).toggleClass('active'); return false;">
       <i class="fa fa-caret-down" aria-hidden="true"></i>
      </button>
      @RenderChildNodes(node.Children)
     </li>
    }
    else
    {
     <li class="nav-item"><a href="@node.Url" class="@isActive @isDisabled nav-link">@node.Text</a></li>
    }
   }<!-- ./ for loop -->
  </ul>
}<!-- ./ node count -->
}<!-- ./ helper -->

@helper RenderChildNodes(IList<MenuNode> nodes)
{
if (nodes.Count > 0)
{
  <ul class="children bg-primary text-white rounded list-unstyled text-left ml-0">
   @foreach (var node in nodes)
   {
    String isActive = "";
    string isDisabled = "";
    if (node.Selected) { isActive = "active"; }
    if (!node.Enabled) { isDisabled = "disabled"; }

    if (node.HasChildren())
    {
     <li class="nav-item px-1">
      <button class="submenuButton" onclick="$(this).toggleClass('active'); return false;">
       <i class="fa fa-caret-down" aria-hidden="true"></i>
      </button>
      <a href="@node.Url" class="@isActive @isDisabled nav-link">@node.Text</a>
      @RenderChildNodes(node.Children)
     </li>
    }
    else
    {
     <li class="nav-item px-1 "><a href="@node.Url" class="@isActive @isDisabled nav-link">@node.Text</a></li>
    }
 

<!-- begin snippet: js hide: true console: true babel: false -->

По сути, мне нужно выяснить, как отобразить братьев и сестер, если текущая страница выбрана, но не имеет детей:

if (!node.HasChildren() && node.Selected) {
    <!--Display Sibling nodes-->
}

Любая помощь будет высоко ценится.

2 ответа

Я не идеален в написании скриптов Razorpages, но я попробую:

@using DotNetNuke.Web.DDRMenu;
@using System.Dynamic;
@using System.Linq;
@inherits DotNetNuke.Web.Razor.DotNetNukeWebPage<dynamic>

@{
   var root = Model.Source.root;
}

@helper RenderNodes(IList<MenuNode> nodes)
{
   if (nodes.Count > 0)
   {
      //Check if the selected node is in the nodes & hasChildren.
      var activeNode= nodes.FirstOrDefault(n=>n.Selected);
      if(activeNode != null && activeNode.HasChildren())
      {
         <li class="nav-item parent">
              <a href="@node.Url" class="@isActive @isDisabled nav-link">@node.Text</a>
              <button class="submenuButton" onclick="$(this).toggleClass('active'); return false;">
              <i class="fa fa-caret-down" aria-hidden="true"></i>
              </button>
              @RenderChildNodes(node.Children)
         </li>

      }
      else
      {
        <ul class="navbar-nav ml-auto">
            @foreach (var node in nodes)
            {
                String isActive = "";
                string isDisabled = "";
                if (node.Selected) { isActive = "active"; }
                if (!node.Enabled) { isDisabled = "disabled"; }

                if (node.HasChildren())
                {
                    <li class="nav-item parent">
                        <a href="@node.Url" class="@isActive @isDisabled nav-link">@node.Text</a>
                        <button class="submenuButton" onclick="$(this).toggleClass('active'); return false;">
                            <i class="fa fa-caret-down" aria-hidden="true"></i>
                        </button>
                        @RenderChildNodes(node.Children)
                    </li>
                }
                else
                {
                    <li class="nav-item"><a href="@node.Url" class="@isActive @isDisabled nav-link">@node.Text</a></li>
                }
            }<!-- ./ for loop -->
        </ul>
      }
   }<!-- ./ node count -->
}<!-- ./ helper -->

Это то, что вам нужно, или чего-то не хватает?

Вот что у нас получилось.

@using DotNetNuke.Web.DDRMenu;
@using System.Dynamic;
@using DotNetNuke.Entities.Portals;
@inherits DotNetNuke.Web.Razor.DotNetNukeWebPage<dynamic>

@{
 var root = Model.Source.root;
}

@helper RenderNodes(IList<MenuNode> nodes)
{
 if (nodes.Count > 0)
 {
  <ol class="breadcrumb">
   @foreach (var node in nodes)
   {
    foreach (var child in node.Children)
    {
     if (child.Text == PortalSettings.Current.ActiveTab.TabName)
     {
      if (node.Parent.Children.Count > 0)
      {
       @RenderChildNodes(node.Children)
      }
     }
    }

    if(node.Selected && node.Depth == 0 && node.HasChildren())
    {
     @RenderChildNodes(node.Children)
    }
   }<!-- ./ for loop -->
  </ol>
 }<!-- ./ node count -->
}<!-- ./ helper -->

@helper RenderChildNodes(IList<MenuNode> nodes)
{
 if (nodes.Count > 0)
 {
  foreach (var node in nodes)
  {
   string isActive = "";
   string isDisabled = "";
   if (node.Selected) { isActive = "active"; }
   if (!node.Enabled) { isDisabled = "disabled"; }

   <li class="breadcrumb-item @isActive">
    <a href="@node.Url" class=" @isDisabled">@node.Text</a>
   </li>
  }
 }
}

@RenderNodes(root.Children)

<script>
 if ($('.breadcrumb-item').length > 0)
  $('.breadcrumb').show();
 else
  $('.breadcrumb').hide();
</script>

Другие вопросы по тегам