MVCSiteMapProvider不显示SiteMapPath

时间:2014-02-20 16:27:15

标签: model-view-controller asp.net-mvc-5 sitemap mvcsitemapprovider

我有一个简单的站点地图:

<mvcSiteMapNode title="Projects" controller="Projects" action="Index"> <!--This wraps the entire site since Projects Index is the homepage-->
    <mvcSiteMapNode title="Projects" controller="Projects" action="Index">
      <mvcSiteMapNode title="Project" controller="Projects" action="Details">
        <mvcSiteMapNode title="Session" controller="Session" action="DetailsNew" />
        <mvcSiteMapNode title="Edit Session" controller="Session" action="Edit" />
      </mvcSiteMapNode>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="My Account" controller="Account" action="ChangePassword" />
    <mvcSiteMapNode title="Admin" controller="Admin" action="Index" >
      <mvcSiteMapNode title="Create User" controller="Admin" action="AddUser" />
      <mvcSiteMapNode title="Manage Users" controller="Admin" action="Users" />
    </mvcSiteMapNode>
  </mvcSiteMapNode>

当我在项目详情页面上放置@Html.MvcSiteMap().SiteMapPath()时,不会显示任何内容。想法?

1 个答案:

答案 0 :(得分:3)

当您添加自定义路线值(“区域”,“控制器”或“操作”以外的其他路线)时,您需要明确指定如何匹配它。

默认情况下,您需要为每个潜在的路由键值创建一个节点。例如,如果您有一个名为“id”的路由密钥,并且您有ids“1”,“2”和“3”的记录,则需要为每个id创建一个节点。

<mvcSiteMapNode title="Project 1" controller="Project" action="Details" id="1">
<mvcSiteMapNode title="Project 2" controller="Project" action="Details" id="2">
<mvcSiteMapNode title="Project 3" controller="Project" action="Details" id="3">

您已经发现了替代方法,即使用savedRouteParameters。这将使节点始终与路由密钥匹配,无论其值如何,这通常是执行CRUD操作的管理页面的理想解决方案。

<mvcSiteMapNode title="Edit Project" controller="Project" action="Edit" preservedRouteParameters="id">

通常当你这样做时,你必须稍微修改显示,因为在菜单上有一个编辑节点没有多大意义(你通常会从记录列表中选择编辑),当你选择它,您通常希望节点显示您选择的记录。您可以使用FilteredSiteMapNodeVisibilityProviderSiteMapTitleAttribute

执行此操作

有关如何设置一组CRUD操作的完整可下载演示,请参阅标题为How to Make MvcSiteMapProvider Remember a User's Position的博客文章。