2017-01-10 1 views
0

여기 내 문제가 있습니다. 하나의 항목과 두 개의 하위 메뉴 항목으로 메뉴를 정의했습니다. 첫 번째 하위 메뉴 항목에는 부모와 동일한 작업 방법이 정의되어 있습니다. 또한 두 작업 메서드 인 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과 관련됩니다.