2017-01-10 7 views
0

これは私の問題です。私は1つの項目と2つのサブメニュー項目でメニューを定義しました。最初のサブメニュー項目では、親と同じアクションメソッドが定義されていることに注意してください。 また、両方のアクションメソッドTest1、Test2にAuthorizeAttributeを追加しました。MVCSiteMapProvider - レンダリングメニューの問題

ユーザーがTest2メソッドにアクセスできない場合、「サブメニュー2」はUIに表示されません。 しかし、ユーザーがTest1メソッド "Top menu item"にアクセスできず、その子がレンダリングされない場合。メニュー全体が消えます。

ユーザーが任意のサブメニュー項目にアクセスできるときはいつでも「トップメニュー項目」を表示したいと思います。 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> 

感謝。

答えて

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と相関することに注意してください。

関連する問題