2017-01-10 4 views
0

Hier ist mein Problem. Ich habe ein Menü mit einem Element und zwei Untermenüpunkten definiert. Beachten Sie, dass das erste Untermenüelement dieselbe Aktionsmethode wie sein Elternelement definiert hat. Ich habe auch AuthorizeAttribute für beide Aktionen Methoden Test1, Test2 hinzugefügt.MVCSiteMapProvider - Rendering Menü Problem

Wenn der Benutzer keinen Zugriff auf die Test2-Methode hat, wird "Submenu item 2" nicht auf der Benutzeroberfläche gerendert, was in Ordnung ist. Wenn Benutzer jedoch keinen Zugriff auf Test1-Methode "Top-Menüelement" hat und seine untergeordneten Elemente nicht gerendert werden. So verschwindet das ganze Menü.

Ich möchte "Top Menüelement" gerendert werden, wenn Benutzer Zugriff auf einen Untermenüpunkt hat. Ist es mit MVBSiteMapProvider etwas machbar?

mvc.sitemap Datei

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

Vielen Dank für jede Hilfe.

Antwort

0

Leider ist das Verhalten von Security Trimming (das im Grunde wie aus ASP.NET 2.0 kopiert wurde) nicht zulässig. Eine Problemumgehung besteht darin, eine visibility provider zu verwenden, um die Sicherheit zu verwalten, indem Sie die IAclModule umbrechen und die Sicherheitsabschaltung deaktivieren.

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

Zur Verwendung müssen Sie einen externen DI-Container verwenden. Sehen Sie sich die Demo hier an: https://github.com/NightOwl888/MvcSiteMapProvider_355, und achten Sie besonders auf die visibility providers Sektion der Config. Beachten Sie, dass dies mit der configuration documentation for multiple visibility providers korreliert.