首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有CRUD操作的MvcSiteMapProvider隐藏mvcSiteMapNode

具有CRUD操作的MvcSiteMapProvider隐藏mvcSiteMapNode
EN

Stack Overflow用户
提问于 2016-03-22 18:44:19
回答 1查看 301关注 0票数 1

在一个项目中,我实现了工作出色的MvcSiteMapProvider。这是一个用@Html.MvcSiteMap().Menu()生成的边菜单

下面是菜单的一个节点(Mvc.sitemap文件)。

代码语言:javascript
运行
复制
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="About" controller="Home" action="About"/>
<mvcSiteMapNode title="Project" controller="Home" action="DummyAction">
  <mvcSiteMapNode title="List" controller="Home" action="Project"/>
  <mvcSiteMapNode title="Edit" controller="Home" action="Edit" preservedRouteParameters="id" visibility="SiteMapPathHelper,!*"/>
</mvcSiteMapNode>

当我从" project“加载"List”时,它会显示一个包含所有项目的页面,并且我可以选择其中之一来使用项目的相关ID加载Edit操作。

问题是,当我在编辑操作页面时,边菜单都被折叠了,但是我希望打开"Project“节点。如果我在菜单中添加了节点"Edit“,它就能工作(匹配节点操作),但我不想要这个节点,因为它对用户毫无用处。

另外,我已经尝试了DefaultSiteMapNodeVisibiltyProvider,如果添加了“编辑”节点,我可以隐藏它,但是当我在“编辑”操作页面中时,项目节点也会关闭。

对于"New/Add“操作,我将面临同样的问题,我不想在侧菜单中看到,但可以从项目列表中的链接中访问。但是,对于这些操作,我想让用户知道它在"Project“部分,其中打开了"Project”节点。

请参阅GitHub:吉特卜项目上的这个项目

诚挚的问候,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-02 09:59:16

您的问题似乎是您还没有考虑到Menu helper的递归特性。有3个Menu与之交互的模板:

  1. MenuHelperModel.cshtml
  2. SiteMapNodeModelList.cshtml
  3. SiteMapNodeModel.cshtml

问题是您还没有向SiteMapNodeModelList.cshtml添加适当的逻辑。此外,MenuHelperModel.cshtml中的逻辑过于复杂。

在同一个页面上处理带有自定义的MenuSiteMapPath helper的一个好方法是使用命名模板,而不是编辑默认模板。

BootstrapMenuHelperModel.cshtml

代码语言:javascript
运行
复制
@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models
<ul id="menu" class="nav sidebar-menu">
    @foreach (var node in Model.Nodes)
    {
        string nodeclass = "";
        if (node.IsInCurrentPath && !node.IsRootNode)
        {
            nodeclass = "active";
            if (node.Children.Any())
            {
                nodeclass += " open";
            }
        }

        <li class="@nodeclass">
            @Html.DisplayFor(m => node)
            @if (node.Children.Any())
            {
                // Here we refer to a named template BootstrapMenuNodeModelList.cshtml
                @Html.DisplayFor(m => node.Children, "BootstrapMenuNodeModelList")
            }
        </li>
    }
</ul>

BootstrapMenuNodeModelList.cshtml

代码语言:javascript
运行
复制
@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModelList
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models
<ul>
    @foreach (var node in Model)
    {
        string nodeclass = "";
        if (node.IsInCurrentPath && !node.IsRootNode)
        {
            nodeclass = "active";
            if (node.Children.Any())
            {
                nodeclass += " open";
            }
        }

        <li class="@nodeclass">
            @Html.DisplayFor(m => node)
            @if (node.Children.Any())
            {
                // Here we refer to a named template BootstrapMenuNodeModelList.cshtml,
                // which happens to be a recursive call to this template.
                @Html.DisplayFor(m => node.Children, "BootstrapMenuNodeModelList")
            }
        </li>
    }
</ul>

用法

在这里,我们告诉Menu helper使用我们的自定义模板BootstrapMenuHelperModel.cshtml

代码语言:javascript
运行
复制
@Html.MvcSiteMap().Menu("BootstrapMenuHelperModel")

注意:您还可以使用相同的方法为SiteMapNodeModel创建一个自定义模板。您只需调用其他模板中的重载即可使用模板名。 示例: 将@Html.DisplayFor(m => node)更改为@Html.DisplayFor(m => node, "MyTemplate"),并在/Views/Shared/DisplayTemplates/文件夹中创建名为MyTemplate.cshtml的相应文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36162681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档