【问题标题】:MvcSiteMap customizableMvcSiteMap 可定制
【发布时间】:2012-11-09 07:38:40
【问题描述】:

我一直在环顾四周,但没有找到解决问题的方法。

我想要这样的菜单:

  1. 首页
  2. 管理(不可点击)
    • 人员
    • 假期

当我点击 Personnel-item 时,我想显示以下内容:

  1. 首页
  2. 管理
    • 人员
      • 新建

当我单击主页项时,我会返回显示第一个菜单的索引页面。 点击 Holiday-item 会显示如下菜单:

  1. 首页
  2. 管理
    • 节假日
      • 新建

我的视图在一个项目中,而我的控制器在另一个项目中。 我似乎无法让它工作。

这是我的站点地图:

<?xml version="1.0" encoding="utf-8" ?><mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" enableLocalization="true">
<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Administration" clickable="false">
        <mvcSiteMapNode title="Employee" controller="Personnel" action="Index">
            <mvcSiteMapNode title="New Employee" controller="Personnel" action="Create"/>
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Holiday" controller="Holidays" action="Index">
            <mvcSiteMapNode title="New Holiday" controller="Holidays" action="HolidayNew"/>
        </mvcSiteMapNode>
    </mvcSiteMapNode>
</mvcSiteMapNode>

我的 web.config:

<siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
      <providers>
        <clear />
        <add name="MvcSiteMapProvider" 
             type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" 
             siteMapFile="~/Mvc.Sitemap" 
             securityTrimmingEnabled="true" cacheDuration="5" enableLocalization="true" 
             scanAssembliesForSiteMapNodes="true" includeAssembliesForScan="" 
             excludeAssembliesForScan="" 
             nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" 
             controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" 
             actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" 
             aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" 
             siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" 
             siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" 
             siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider" />
      </providers>

【问题讨论】:

    标签: c#-4.0 asp.net-mvc-4 mvcsitemapprovider


    【解决方案1】:

    您需要修改 MVCSiteMap DisplayTemplates - 这可以让您对菜单的显示方式进行精细控制。本教程可能会有所帮助:http://edspencer.me.uk/2011/09/20/mvc-sitemap-provider-tutorial-2-breadcrumbs/

    更新

    这是一个让您入门的示例。

    Mvc.sitemap

    <mvcSiteMapNode title="RootNode" controller="Home" action="Index">
      <mvcSiteMapNode title="Home" controller="Home" action="Index"/>
      <mvcSiteMapNode title="Administration" clickable="false">
        <mvcSiteMapNode title="Personnel" controller="Home" action="Personnel">
          <mvcSiteMapNode title="New Personnel" controller="Home" action="PersonnelNew"/>
        </mvcSiteMapNode>
        <mvcSiteMapNode title="Holiday" controller="Home" action="Holiday">
          <mvcSiteMapNode title="New Holiday" controller="Home" action="HolidayNew"/>
        </mvcSiteMapNode>
      </mvcSiteMapNode>
      <mvcSiteMapNode title="About" controller="Home" action="About"/>
    </mvcSiteMapNode>
    

    SiteMapHelperModel.cshtml

    <ul class="siteMap">
        @foreach (var node in Model.Nodes) {
            if (node.IsRootNode)
            {
                foreach (var menu in node.Children)
                {
                    <li>@Html.DisplayFor(m => menu) 
                        @if (menu.IsInCurrentPath || menu.IsCurrentNode)
                        {
                            if (menu.Children.Any())
                            {
                                @Html.DisplayFor(m => menu.Children)
                            }
                        }
                        else
                        {
                            foreach (var child in menu.Children)
                            {
                                @Html.DisplayFor(m => child)
                            }
                        }
                    </li>
                }
            }
        }
    </ul>
    

    SiteMapNodeModelList.cshtml

    <ul>
        @foreach (var node in Model) {
            if (node.IsCurrentNode)
            {
                <li>@Html.DisplayFor(m => node) 
                    @foreach (var child in node.Children)
                    {
                        @Html.DisplayFor(m => child);
                    }
                </li>
            }
            else if (node.IsInCurrentPath)
            {
                <li>@Html.DisplayFor(m => node) 
                    if (node.Children.Any())
                    {
                        @Html.DisplayFor(m => node.Children)
                    }
                </li>
            }
        }
    </ul>
    

    SiteMapNodeModel.cshtml

    @if (Model.IsClickable) { 
        <a href="@Model.Url">@Model.Title</a>
    } else { 
        <text>@Model.Title</text>
    }
    

    现在,当我回家时,菜单呈现为:

    <ul class="siteMap">
        <li>
            <a href="/">Home</a>
        </li>
        <li>
            Administration
            <a href="/Home/Personnel">Personnel</a>
            <a href="/Home/Holiday">Holiday</a>
        </li>
        <li>
            <a href="/Home/About">About</a>
        </li>
    </ul>
    

    当我点击人员菜单项时,我得到:

    <ul class="siteMap">
        <li>
            <a href="/">Home</a>
        </li>
        <li>
            Administration
            <ul>
                <li>
                    <a href="/Home/Personnel">Personnel</a>
                    <a href="/Home/PersonnelNew">New Personnel</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="/Home/About">About</a>
        </li>
    </ul>
    

    当我点击假日菜单项时,我得到:

    <ul class="siteMap">
        <li>
            <a href="/">Home</a>
        </li>
        <li>
            Administration
            <ul>
                <li>
                    <a href="/Home/Holiday">Holiday</a>
                    <a href="/Home/HolidayNew">New Holiday</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="/Home/About">About</a>
        </li>
    </ul>
    

    这不是您想要的确切功能,但希望它足以让您入门。

    更新

    Web.config

    <siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
      <providers>
        <clear />
        <add name="MvcSiteMapProvider"
             type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider"
             siteMapFile="~/Mvc.Sitemap"
             securityTrimmingEnabled="true"
             cacheDuration="5"
             enableLocalization="true"
             scanAssembliesForSiteMapNodes="true"
             includeAssembliesForScan=""
             excludeAssembliesForScan=""
             attributesToIgnore="clickable,visibility"
             nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider"
             controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider"
             actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider"
             aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider"
             siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider"
             siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider"
             siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider" />
      </providers>
    </siteMap>
    

    【讨论】:

    • 我试过了,但是没用。所以我把我的控制器移回了 UI 项目。我可以在这里添加 [MvcSiteMapNode(Title = "Create", ParentKey = "Personnel")]。但它仍然没有显示我想要的方式。它总是显示我的“创建”项目,我只想在查看人员列表时显示这些项目。当我在人员列表中时,我不想显示“假期”项目。
    • 您应该查看的部分是SiteMapHelperModelSiteMapNodeModelSiteMapNodeModelList。通过修改这些,您应该能够实现您喜欢的任何样式。
    • 我一直在尝试解决我的问题,但没有成功。我不知道我做错了什么。
    • 您能否用这些文件的内容更新您的问题,以便我们快速浏览一下?
    • 很遗憾,我无法重现您的问题。因此,我创建了一个与您上面的规范类似的示例应用程序,带有一个工作菜单,以便您可以将其与您的应用程序进行比较,并希望确定问题所在。您可以在GitHub 找到它。 (注意是MVC3,这里不能安装MVC4)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-06-15
    • 2012-01-21
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多