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>

感谢您的任何帮助。

不幸的是,安全修整的行为(基本上是从 ASP.NET 2.0 中复制的)不允许这样做。因此,解决方法是使用可见性提供程序通过包装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,并特别注意配置的可见性提供程序部分。请注意,这与多个可见性提供程序的配置文档相关。

相关内容

  • 没有找到相关文章

最新更新