Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 为什么MVC站点地图会在控制器上存在操作的地方隐藏菜单项?_Asp.net Mvc 3_Mvcsitemapprovider - Fatal编程技术网

Asp.net mvc 3 为什么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

我正在为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" 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>