停止导航栏刷新 - Umbraco

Stop the navigation bar from refreshing - Umbraco

我找不到任何关于我的问题的信息,所以我决定 post 自己找一个。

我正在使用具有下拉菜单的导航栏。每当我打开下拉菜单并导航到其中一个页面时,导航就会刷新并关闭下拉菜单。当我转到其中一个页面时,下拉菜单需要保持打开状态,我尝试 Model.Content.AncestorOrSelf().Descendants("document") 试图阻止导航栏刷新,但这似乎不起作用(正如人们所说)。

这是我的菜单结构:

"Hulp per browser" 下方的所有内容都在下拉列表中,当我再次单击 "Hulp per browser" 时它们将消失。

这是我的代码:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
<div class="col-sm-3">
    <div class="NavDigiCampuz">
        <h3>Helpcentrum</h3>
        <li class="NoBullet"><a class="NormalA" href="https://digicampuz.nl/">Terug naar digicampuz</a></li><br>
            <ul class="nav nav-list tree">
                @{                                  
                    var documentRootNodeId = Model.Content.GetPropertyValue("documentRoot", true); // Fetch recursive document root id.
                    var selection = Umbraco.TypedContent(documentRootNodeId).Children.Where("Visible"); // Select all nodes below the document root.
                }

                @foreach(var item in Model.Content.AncestorOrSelf(2).Descendants("document").ToList()){
                    foreach (var ItemChild in @item.Children("categorieMenu")){
                        if(ItemChild.Children.Any())
                        {
                        <li class="MenuItems"><p>@ItemChild.Name</p></li>   
                            foreach (var Subitem in @ItemChild.Children){
                                if (Subitem.Children("hoofdstuk").Any())
                                {
                                    <li class="item">
                                        @if(Subitem.GetPropertyValue("hoofdstukIcoon") != "") {
                                            <a class="NormalA aNav" href="#"><i class="fa fa-@(Subitem.GetPropertyValue("hoofdstukIcoon")) fa-fw"></i> @Subitem.Name <i id="Arrow" class="fa fa-arrow-right" style="font-size:10px;" aria-hidden="true"></i></a>
                                        }else{
                                            <a class="NormalA aNav" href="#">@Subitem.Name <i id ="Arrow" class="fa fa-arrow-right" style="font-size:10px;" aria-hidden="true"></i></a>
                                        }
                                        @foreach (var Finalitem in @Subitem.Children){
                                        <ul class="submenu">
                                            @if(Finalitem.GetPropertyValue("hoofdstukIcoon") != "") {
                                            <br><li><a class="NormalA aNav" href="@Finalitem.Url"><i class="fa fa-@(Finalitem.GetPropertyValue("hoofdstukIcoon")) fa-fw"></i>@Finalitem.Name </a></li>  
                                            }else{
                                                <br><li><a class="NormalA aNav" href="@Finalitem.Url">@Finalitem.Name</a></li><br>
                                            }
                                        </ul>   
                                        } 
                                    </li>
                                    }else
                                        {
                                            if(Subitem.GetPropertyValue("hoofdstukIcoon") != "") {
                                                <li><a class="NormalA aNav" href="@Subitem.Url"><i class="fa fa-@(Subitem.GetPropertyValue("hoofdstukIcoon")) fa-fw"></i> @Subitem.Name</a></li>
                                            }else{
                                                <li><a class="NormalA aNav" href="@Subitem.Url">@Subitem.Name</a></li>  
                                            }
                                    }
                                }   
                            }
                        }
                    }   
            </ul>
    </div>
</div>

<script>
    $(".item").click(function(){
        $(this).children(".submenu").toggle(); //it will display or hide your submenu when clicking the item.
    });
</script>

<style>
    .submenu{
    display: none;
    list-style:none;
    }
</style>    

我确实计划在一切正常时从页面中删除脚本和样式。

首先你的代码有几个问题:

  • 删除过滤子项的位置并保持 var selection = Umbraco.TypedContent(documentRootNodeId).Children("Visible");
  • 将您的 hoofdstukIcoon 转换为字符串 Subitem.GetPropertyValue<string>("hoofdstukIcoon")
  • 第一个 <li class="noBullet"> 应该在您的导航列表中,而不是在外部。
  • 你不应该把 <br> 放在你的列表项之间,如果你想要边距使用 css.

现在我们将重点关注您的子菜单问题。您对 javascript 所做的只是使用显示 属性 来隐藏或显示您的子菜单,但是当页面呈现时,Razor 不知道是否应该隐藏它。要解决这个问题,您必须创建一个新的 class,例如 .visible,它可以被 Razor 和 Javascript.

使用

您还应该将您的 <ul class="submenu"> 移出您的 @foreach (var Finalitem in Subitem.Children),因为您现在正在创建一个新列表,每一项对应一项。

您还应该在子菜单之前包含一个条件,以防没有子菜单并且我们不需要子菜单 @if (Subitem.Children.Any()) {

用 Razor 告诉你的子菜单是否必须显示的方法是这样做的:

var isVisible = Model.Content.IsDescendantOrSelf(Subitem) ? "visible" : "";
<ul class="submenu @isVisible">

因此在该示例中,您的子菜单将显示当前页面是该子项目还是其子项目之一。

你的 JS 脚本会变成这样:

$(".item").click(function () {
        $(this).children(".submenu").toggleClass('visible'); //it will display or hide your submenu when clicking the item.
});

还有你的CSS这个:

<style>
    .submenu {
        display: none;
        list-style: none;
    }

    .submenu.visible {
        display: block;
    }
</style>