MVCSiteMapProvider - 渲染菜单问题

时间:2017-01-10 09:43:46

标签: mvcsitemapprovider

这是我的问题。我已经定义了一个项目和两个子菜单项目的菜单。请注意,第一个子菜单项已定义与其父级相同的操作方法。 我还在两个操作方法Test1,Test2上添加了AuthorizeAttribute。

当用户无法访问Test2方法时,然后"子菜单项2"没有在UI上呈现,这是好的。 但是,当用户无权访问Test1方法"顶级菜单项"并且它的孩子没有被渲染。所以整个菜单都消失了。

我想要"顶级菜单项"用户有权访问任何子菜单项时呈现。它是否适用于MVBSiteMapProvider?

mvc.sitemap文件

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0" xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">
    <mvcSiteMapNode title="Home" controller="Home" action="Index" mainnav="false">
        <mvcSiteMapNode title="Top menu item" controller="Test" action="Test1" >
             <mvcSiteMapNode title="Submenu item 1" controller="Test" action="Test1" />
             <mvcSiteMapNode title="Submenu item 2" controller="Test" action="Test2" />
       </mvcSiteMapNode>
   </mvcSiteMapNode>

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

不幸的是,安全修整的行为(基本上是从ASP.NET 2.0复制的)并不允许这样做。因此,解决方法是使用visibility provider来管理安全性,方法是包装IAclModule,并禁用安全修整。

public class AclModuleVisibilityProvider
    : SiteMapNodeVisibilityProviderBase
{
    public AclModuleVisibilityProvider(
        IAclModule aclModule
        )
    {
        if (aclModule == null)
            throw new ArgumentNullException("aclModule");

        this.aclModule = aclModule;
    }
    private readonly IAclModule aclModule;

    public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
    {
        return this.aclModule.IsAccessibleToUser(node.SiteMap, node);
    }
}

使用时,您需要使用外部DI容器。请参阅此处的演示:https://github.com/NightOwl888/MvcSiteMapProvider_355,并特别注意配置的visibility providers部分。请注意,这与configuration documentation for multiple visibility providers相关联。