MvcSiteMapProvider使用CRUD操作隐藏mvcSiteMapNode

时间:2016-03-22 18:44:19

标签: twitter-bootstrap mvcsitemapprovider

在一个项目中,我实施了MvcSiteMapProvider,效果很好。 这是使用@ Html.MvcSiteMap()生成的侧边菜单.Menu()

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

<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>

当我加载&#34; List&#34;从&#34; Project&#34;,它显示一个包含所有项目的页面,我可以选择其中一个来加载带有项目相关ID的Edit操作。

问题是,当我在编辑操作页面中时,侧边菜单全部折叠,但我希望有&#34;项目&#34;节点打开了。如果我添加节点&#34;编辑&#34;在菜单中,它工作(匹配节点动作),但我不想要这个节点,因为它对用户没用。

另外,我已经尝试过DefaultSiteMapNodeVisibiltyProvider,我可以隐藏&#34;编辑&#34;节点如果添加,但是当我在&#34;编辑&#34;在操作页面中,项目节点也已关闭。

对于&#34; New / Add&#34;我将面临同样的问题。我不希望在侧边菜单中看到的操作,但可以从项目列表中的链接访问。但是,对于这些操作,我想让用户知道它在&#34; Project&#34;部分,&#34;项目&#34;节点开放。

在GitHub上查看此项目: Project on Github

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

您的问题似乎是您没有考虑Menu HTML帮助程序的递归性质。 Menu与之交互的模板有3个:

  1. MenuHelperModel.cshtml
  2. SiteMapNodeModelList.cshtml
  3. SiteMapNodeModel.cshtml
  4. 问题是您尚未向SiteMapNodeModelList.cshtml添加适当的逻辑。此外,MenuHelperModel.cshtml中的逻辑过于复杂。

    使用自定义在同一页面上处理MenuSiteMapPath HTML帮助程序的好方法是使用命名模板而不是编辑默认模板。

    BootstrapMenuHelperModel.cshtml

    @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

    @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 HTML帮助器使用名为BootstrapMenuHelperModel.cshtml的自定义模板。

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

    注意:您还可以使用相同的方法为SiteMapNodeModel创建自定义模板。您只需要调用其他模板中的重载即可使用模板名称。

         

    示例:

         

    @Html.DisplayFor(m => node)更改为@Html.DisplayFor(m => node, "MyTemplate"),并在MyTemplate.cshtml文件夹中创建名为/Views/Shared/DisplayTemplates/的相应文件。