MvcSiteMapProvider "Home" 菜单中的按钮在点击时不起作用

MvcSiteMapProvider "Home" button in menu not working onclick

我有一个使用 MvcSiteMapProvider 生成的菜单,使用 bootstrap 和路由的帮助程序:

控制器主页:

[MvcSiteMapNode(Title = "Home", Key = "home")]
public ActionResult Index()
{
    return View(model);
}

控制器其他:

[Route("mypageview", Name = "mypage")]
[MvcSiteMapNode(Title = "My Page", ParentKey = "home", Key = "mypage")]
public ActionResult mypage()
{
    mymodel model = .....
    return View(model);
}

帮手:

<div class="navbar-collapse collapse">
    <ul class="nav navbar-nav">
        @foreach (var node in Model.Nodes)
            {
                if (node.Children.Any())
                {
                    <li>
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">@node.Title<strong class="caret"></strong></a>
                         <ul class="dropdown-menu">
                             @for (int i = 0; i < node.Children.Count; i++)
                             {
                                   <li>@Html.DisplayFor(x => node.Children[i])</li>
                             }
                         </ul>
                     </li>
                }
                else
                {
                    <li>
                         <a href="@node.Url" class="dropdown-toggle" data-toggle="dropdown">@node.Title</a>
                    </li>
                }
            }
     </ul>
</div> 

布局视图:

@Html.MvcSiteMap().Menu("BootstrapMenuHelperModel")

所有菜单项和下拉菜单都运行良好。他们都导航到正确的位置。但是,菜单的 'Home' 按钮(第一个)不会导航到索引。

我试过在路由中包含索引,但这只会破坏网站。

这是 bootstrap 的限制。由于它是为触摸屏设计的,据我所知,不可能使用打开子菜单的菜单项来导航到页面。在触摸屏设备上,无法判断用户何时想要打开子菜单与导航到当前菜单项的位置,因此唯一可用的操作是打开和关闭子菜单。

有一些 known workarounds,但我没有尝试过,所以无法告诉您与 MvcSiteMapProvider 一起使用的最佳解决方案是什么。可以说这对 MvcSiteMapProvider 根本不是问题,因此您可能想询问 bootstrap 社区该怎么做。

我通过向没有子节点的节点添加 url 解决了这个问题,onclick 在有子节点的节点上打开了标准的子菜单:

@foreach (var node in Model.Nodes)
{
    if (node.Children.Any())
    {
        <li>
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">@node.Title<strong class="caret"></strong></a>
            <ul class="dropdown-menu">
                <li>@Html.DisplayFor(x => node)</li>
                @for (int i = 0; i < node.Children.Count; i++)
                {
                    <li>@Html.DisplayFor(x => node.Children[i])</li>
                }
            </ul>
       </li>
    }
    else
    {
        <li>
            <a href="@node.Url">@node.Title</a>
        </li>
    }
}

对于像我这样第一次这样做的人,我还添加了一个订单标签,以按照我想要的顺序排列我的菜单项:

[MvcSiteMapNode(Title = "mytitle", 
                ParentKey =  "home", 
                Key = "experiencevenuesandcircuits", 
                Order = 5)]