2017-01-10 2 views
0

Voici mon problème. J'ai défini le menu avec un élément et deux éléments de sous-menu. Notez que le premier élément de sous-menu a défini la même méthode d'action que son parent. J'ai également ajouté AuthorizeAttribute sur les deux méthodes d'actions Test1, Test2.MVCSiteMapProvider - rendu du menu de rendu

Lorsque l'utilisateur n'a pas accès à la méthode Test2, l'option "Sous-menu 2" n'est pas restituée sur l'interface utilisateur, ce qui est correct. Toutefois, lorsque l'utilisateur n'a pas accès à la méthode Test1 "Top menu item" et ses enfants ne sont pas rendus. Donc, le menu entier disparaît.

Je souhaite que l'option "Élément de menu supérieur" s'affiche lorsque l'utilisateur a accès à un élément de sous-menu. Est-ce quelque chose de réalisable avec MVBSiteMapProvider?

fichier 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> 

Merci pour toute aide.

Répondre

0

Malheureusement, le comportement de Security Trimming (qui a été essentiellement copié à partir d'ASP.NET 2.0) ne le permet pas. Ainsi, une solution de contournement consiste à utiliser un visibility provider pour gérer la sécurité en enveloppant le IAclModule et en désactivant le découpage de sécurité.

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); 
    } 
} 

Pour l'utilisation, vous devez utiliser un conteneur DI externe. Voir la démo ici: https://github.com/NightOwl888/MvcSiteMapProvider_355, et accordez une attention particulière à la section visibility providers de la config. Notez que ceci est corrélé avec le configuration documentation for multiple visibility providers.