Kor*_*ori 8 c# asp.net-mvc mvcsitemapprovider
我最近遇到了试图使用MvcSiteMapProvider的路障.
在我的申请中,我有三个不同的领域:着陆,应用和管理.我目前已经实现了MvcSiteMapProvider并且它的工作效果令人惊讶,但我现在要做的是 - 使用Html MvcSiteMap Helper并根据我所在的区域指定不同的地图提供者.
所以,当我:
我尝试过以下方法:
共享 - > _AppLayout.cshtml
@Html.Partial("_Menu")
Run Code Online (Sandbox Code Playgroud)
共享 - > _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()))
{
<text>@Html.MvcSiteMap("AppSiteMapProvider").Menu()</text>
}
else if (currentArea.ToString() == "Admin")
{
<text>@Html.MvcSiteMap("AdminSiteMapProvider").Menu()</text>
}
}
Run Code Online (Sandbox Code Playgroud)
}
有什么建议?我不想将_AppLayout.cshtml内容复制/粘贴到一个区域的新主服务器中,我宁愿它动态地选择正确的提供程序.
小智 8
在web.config文件中添加类似的东西(每个区域的新提供者):
<siteMap defaultProvider="AppSiteMapProvider" enabled="true">
<providers>
<clear />
<add name="AppSiteMapProvider" type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" siteMapFile="~/Mvc.Sitemap" securityTrimmingEnabled="true" cacheDuration="5" enableLocalization="true" scanAssembliesForSiteMapNodes="true" includeAssembliesForScan="" excludeAssembliesForScan="" attributesToIgnore="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" />
<add name="AdminSiteMapProvider" type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" siteMapFile="~/Areas/Admin/Mvc.Sitemap" securityTrimmingEnabled="true" cacheDuration="5" enableLocalization="true" scanAssembliesForSiteMapNodes="true" includeAssembliesForScan="" excludeAssembliesForScan="" attributesToIgnore="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>
Run Code Online (Sandbox Code Playgroud)
将它放在您的公共母版页中(菜单相同):
var currentArea = (string)ViewContext.RouteData.DataTokens["area"];
if (string.IsNullOrWhiteSpace(currentArea))
{
<text>@Html.MvcSiteMap("AppSiteMapProvider").SiteMapTitle()</text>
}
else if (currentArea.ToString() == "Admin")
{
<text>@Html.MvcSiteMap("AdminSiteMapProvider").SiteMapTitle()</text>
}
Run Code Online (Sandbox Code Playgroud)
最后为每个区域创建一个站点地图文件.
这个对我有用.希望能帮助到你.
我正在使用版本4,其中指定的提供程序显然不起作用.在v4中有多个站点地图的规定方式坦率地吓坏了我的bejeebus,并且比我想要的工作更多.
根据@ NightOwl888的建议评论他自己的答案,我在v4中使用了命名的帮助器选项.我仍然只有一个mvc.sitemap文件,但我有相互独立的可见性选项.
第1步:在web.config中添加此设置
<add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider"/>
Run Code Online (Sandbox Code Playgroud)
第2步:选择不同"菜单"的名称,并将它们应用于visibility每个节点上的属性.在我的情况下,我有"常规"和"管理员".同样,所有这些都在同一个mvc.sitemap文件中.
<mvcSiteMapNode title="Reports" controller="Report" action="List" visibility="Regular,!*"/>
<mvcSiteMapNode title="Downloads" controller="Download" action="List" visibility="Regular,!*"/>
<mvcSiteMapNode title="Documents" controller="Document" action="List" visibility="Regular,!*"/>
<mvcSiteMapNode title="Users" controller="User" action="List" visibility="Admin,!*"/>
<mvcSiteMapNode title="Projects" controller="Project" action="List" visibility="Admin,!*"/>
<mvcSiteMapNode title="Misc" clickable="false" visibility="Admin,!*">
<mvcSiteMapNode title="Reports" controller="Report" action="List" visibility="Admin,!*"/>
<mvcSiteMapNode title="Downloads" controller="Download" action="List" visibility="Admin,!*"/>
<mvcSiteMapNode title="Documents" controller="Document" action="List" visibility="Admin,!*"/>
</mvcSiteMapNode>
Run Code Online (Sandbox Code Playgroud)
您会注意到,报告,下载和文档链接可供常规用户和管理员用户使用,但由于管理员很少使用这些选项,我想将它们放在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" })
}
Run Code Online (Sandbox Code Playgroud)
我使用了这个bootstrap/sitemap教程,如果你不是我认为你可以打电话@Html.MvcSiteMap().Menu(new { name = "MENUNAME" })
一个应用程序中的多个站点地图解释了如何在v4中完成此操作,这已经从已接受的答案中改变了很多 - 这是针对v3和之前的.
主要的区别是,现在多个Sitemap与DI配置,您需要实现ISiteMapCacheKeyGenerator和/或ISiteMapCacheKeyToBuilderSetMapper,这是小班告诉MvcSiteMapProvider如何将传入的HTTP请求到每个网站导航地图.