Asp.net mvc 3 为什么MVC站点地图会在控制器上存在操作的地方隐藏菜单项?
我正在为MVC3使用MVC站点地图,但有问题。 考虑下面的站点地图文件:Asp.net mvc 3 为什么MVC站点地图会在控制器上存在操作的地方隐藏菜单项?,asp.net-mvc-3,mvcsitemapprovider,Asp.net Mvc 3,Mvcsitemapprovider,我正在为MVC3使用MVC站点地图,但有问题。 考虑下面的站点地图文件: <?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" act
<?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" changeFrequency="Always" updatePriority="Normal" Description="Test HOME">
<mvcSiteMapNode title="Today" controller="Dashboard" action="Today" />
<mvcSiteMapNode title="Today1" controller="Dashboard" action="Today1" />
<mvcSiteMapNode title="Today2" controller="Dashboard" action="Today2" />
<mvcSiteMapNode title="Today3" controller="Dashboard" action="Today3" />
<mvcSiteMapNode title="Today4" controller="Dashboard" action="Today4" />
</mvcSiteMapNode>
</mvcSiteMap>
当我加载网页时,我只获得以下选项:
今天1,今天2,今天3,今天4
但今天没有展示。这是控制器上的一个操作,而其他操作不存在。为什么要隐藏控制器上实际存在的项目?我取消了控制器上的授权,以排除它与授权有关,但仍然具有相同的效果
这是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="false"
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>
</system.web>
我发现了问题所在。
HttpContext用户的InRole方法在库代码中的MvcSiteMapProvider.DefaultAclModule中使用。
我使用的是Forms身份验证,这意味着InRole永远不会工作,因为用户上下文上的roles属性没有设置,它不知道如何应用角色
我可以编写自己的aclmodule提供程序来检查凭证中存储的角色的身份验证凭证,也可以为global.asax中的每个身份验证请求事件使用角色集设置上下文。最后我选择了后者:
e、 g
@雅法,你的方法帮了我!!谢谢下面是我如何实现它的。。也许它也能帮助别人
public class MenuVisibilityController : Controller, ISiteMapNodeVisibilityProvider
{
public bool IsVisible(SiteMapNode Node, HttpContext context, IDictionary<string, object> sourceMetadata)
{
return context.User.Identity.IsAuthenticated;
}
}
为MVC sitemap实现了可见性提供程序,然后将其用于特定节点的可见性,如下所示:
<mvcSiteMapNode title="Test Menu" controller="Account" action="Index" visibilityProvider="MyProject.Controllers.MenuVisibilityController, MyProject">
<mvcSiteMapNode title="Test Item 1" controller="Account" action="GetItems" />
</mvcSiteMapNode>
在VisibilityProvider中指定实现的控制器应该可以达到这个目的
<mvcSiteMapNode title="Test Menu" controller="Account" action="Index" visibilityProvider="MyProject.Controllers.MenuVisibilityController, MyProject">
<mvcSiteMapNode title="Test Item 1" controller="Account" action="GetItems" />
</mvcSiteMapNode>