使用多个MvcSiteMaps

我最近遇到了试图使用MvcSiteMapProvider的路障 。

在我的申请中,我有三个不同的领域:着陆,应用和管理。 我目前已经实现了MvcSiteMapProvider,它的工作效果令人惊讶,但我现在要做的是 – 使用Html MvcSiteMap Helper并根据我所在的区域指定不同的地图提供者。

所以,当我:

  • 在“Admin”区域中 – 我想使用名为“AdminSiteMapProvider”的提供程序。
  • 在“应用程序”区域中 – 我想使用名为“AppSiteMapProvider”的提供程序。

我尝试过以下方法:

共享 – > _AppLayout.cshtml

@Html.Partial("_Menu") 

共享 – > _Menu.cshtml

 @{ if (HttpContext.Current != null && HttpContext.Current.Handler is System.Web.Mvc.MvcHandler) { var handler = HttpContext.Current.Handler as System.Web.Mvc.MvcHandler; var currentArea = handler.RequestContext.RouteData.Values["area"] ?? string.Empty; if (!string.IsNullOrEmpty(currentArea.ToString())) { @Html.MvcSiteMap("AppSiteMapProvider").Menu() } else if (currentArea.ToString() == "Admin") { @Html.MvcSiteMap("AdminSiteMapProvider").Menu() } } 

}

有什么建议? 我不想将_AppLayout.cshtml内容复制/粘贴到一个区域的新主服务器中,我宁愿它动态地选择正确的提供程序。

在web.config文件中添加这样的内容(每个区域的新提供者):

        

将它放在您的公共母版页中(菜单相同):

 var currentArea = (string)ViewContext.RouteData.DataTokens["area"]; if (string.IsNullOrWhiteSpace(currentArea)) { @Html.MvcSiteMap("AppSiteMapProvider").SiteMapTitle() } else if (currentArea.ToString() == "Admin") { @Html.MvcSiteMap("AdminSiteMapProvider").SiteMapTitle() } 

最后为每个区域创建一个站点地图文件。

这个对我有用。 希望能帮助到你。

一个应用程序中的多个站点地图解释了如何在v4中完成此操作,这已经从已接受的答案中改变了很多 – 这是针对v3和之前的。

主要区别在于现在多个站点地图配置了DI,您需要实现ISiteMapCacheKeyGenerator和/或ISiteMapCacheKeyToBuilderSetMapper,这些小类告诉MvcSiteMapProvider如何将传入的HTTP请求映射到每个站点地图。

我正在使用版本4,其中指定的提供程序显然不起作用。 在v4中有多个站点地图的规定方式坦率地吓坏了我的bejeebus,并且比我想要的工作更多。

根据@ NightOwl888关于他自己答案的建议评论,我在v4中使用了命名的帮助器选项。 我仍然只有一个mvc.sitemap文件,但我有相互独立的可见性选项。

第1步:在web.config中添加此设置

  

第2步:选择不同“菜单”的名称,并将它们应用于每个节点上的visibility属性。 在我的情况下,我有“常规”和“管理员”。 同样,所有这些都在同一个mvc.sitemap文件中。

           

您会注意到,报告,下载和文档链接可供常规用户和管理员用户使用,但由于管理员很少使用这些选项,我想将它们放在Misc子菜单中。

第3步:在_Layout.cshtml中,确定要显示的菜单。

 @if(User.IsInRole("Admin")) { @Html.MvcSiteMap().Menu("BootstrapMenuHelperModel", false, new { name = "Admin" }) } else { @Html.MvcSiteMap().Menu("BootstrapMenuHelperModel", false, new { name = "Regular" }) } 

我使用了这个bootstrap / sitemap教程 ,如果你不是我认为你可以调用@Html.MvcSiteMap().Menu(new { name = "MENUNAME" })

这就是我最终做的事情(基于这个问题)。 它有点简单,希望它有所帮助。 我刚刚在区域之后命名了我的站点地图提供程序,或者“默认”。