2014-03-31 2 views
1

MVC4 용 MvcSiteMapProvider (v4.6.1)를 사용하여 빵 부스러기 및 메뉴를 처리합니다. 나는 @Html.MvcSiteMap().Menu()을 설치하고, 설정하고, 사용하는 100 단계의 튜토리얼을 보았다.MvcSiteMapProvider를 사용하여 노드 수준의 일부를 표시합니다.

이제 최상위 수준의 일부를 보여주는 메뉴가 필요합니다. 현재 최상위 노드에는 홈, 프로필, 로그인, 1 번, 2 번, 3 번이 포함됩니다. this SOf answer에 그려진 항목을 모두 가로 행으로 표시하는 메뉴를 만들었습니다. 또한 시스템에 권한이 포함되면 일단 3 번을 액세스 할 수없는 사용자는 해당 메뉴에서 해당 권한을 볼 수 없습니다.

내가 원하는 것은 홈 및 로그인이 빵 부스러기에 표시되어야하지만 메뉴에 있어서는 안됩니다. 현재 사이트 맵에서는 연속적이지 않습니다.

어떤 권장 사항이 있습니까?

내 현재보기, 링크 된 답변에서 촬영 도매 :

@model MvcSiteMapProvider.Web.Html.Models.MenuHelperModel 
@using MvcSiteMapProvider.Web.Html.Models 

<div class="nav navbar-nav navbar-left"> 
    <ul class="nav navbar-nav"> 
     @foreach (var node in Model.Nodes) { 
      <li>@Html.DisplayFor(m => node)</li> 
     } 
    </ul> 
</div> 

이보기에 내 메뉴보기에서 내 현재 통화 :

@Html.MvcSiteMap().Menu("MenuHelper", 0, true, false, 1) 

나는 물론, 새로운 메뉴를 만들 수 있습니다 내가 보여주고 싶지 않은 것을 걸러내는 도우미.

편집 : Mvc.sitemap는 :

<mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="MainMenu,!*"> 
    <mvcSiteMapNode title="About" controller="Home" action="About"/> 
    <mvcSiteMapNode title="Profile" controller="Home" action="UpdateProfile" visibility="MainMenu,!*"/> 
    <mvcSiteMapNode title="Login" controller="SGAccount" action="Login"> 
     <mvcSiteMapNode title="Register" controller="SGAccount" action="Register"> 
     </mvcSiteMapNode> 
    </mvcSiteMapNode> 
    <mvcSiteMapNode title="Thing1" controller="Thing1" action="Index" visibility="MainMenu,!*"> 
     <mvcSiteMapNode title="Thing1-action1" controller="Thing1" action="action1" visibility="RoleMenu,!*"/> 
     <mvcSiteMapNode title="Thing1-action2" controller="Thing1" action="action2" visibility="RoleMenu,!*"/> 
    </mvcSiteMapNode> 
    <mvcSiteMapNode title="Thing2" controller="Thing2" action="Index" visibility="MainMenu,!*"> 
    </mvcSiteMapNode> 
    </mvcSiteMapNode> 

MAINMENU 집, 프로필, 정보, 로그인, Thing1 및 Thing2을 보여줍니다. 그것 모두를 보여서는 안됩니다.

편집 2 : 외부 DI에 대한 구조지도를 사용하여, 나는이 라인을 추가,하지만 난 그게 맞습니다 것을 확실하지 않다 :

x.For<ISiteMapNodeVisibilityProviderStrategy>().Use<SiteMapNodeVisibilityProviderStrategy>(); 

편집 3 : 내 빵 부스러기, @Html.MvcSiteMap().SiteMapPath()는 작동이 중지. 이것 역시 수정이 필요합니다.

편집 4 : 내부 DI 설정을 web.config에서 제거하여 이전 두 편집 문제를 수정했습니다. 이제 나는 내가 보여주고 싶은 것을 보여 주기만합니다.

답변

4

이 작업을 수행하는 가장 좋은 방법은 named HTML helpers을 ISiteMapNodeVisibilityProvider와 함께 사용하는 것입니다. 각 메뉴에 이름을 지정하여 특정 메뉴 인스턴스에 노드를 표시하는 데 사용할 수있는 상자에 FilteredSiteMapNodeVisibilityProvider가 있습니다.

1) 허위 및 외부 DI를 들어 FilteredSiteMapNodeVisibilityProvider

<appSettings> 
    <add key="MvcSiteMapProvider_VisibilityAffectsDescendants" value="false"/> 
    <add key="MvcSiteMapProvider_DefaultSiteMapNodeVisibiltyProvider" value="MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider"/> 
</appSettings> 

에 기본 가시성 제공으로 설정 VisibilityAffectsDescendants,이 설정은 DI 컨테이너에 의해 제공 될 필요가있다. 다음은 StructureMap에서이를 수행하는 방법입니다.

// Near the top of the DI module 
// (this setting is provided to the constructor of SiteMapBuilderSet) 
bool visibilityAffectsDescendants = false; 

// Visibility Providers 
this.For<ISiteMapNodeVisibilityProviderStrategy>().Use<SiteMapNodeVisibilityProviderStrategy>() 
    .Ctor<string>("defaultProviderName").Is("MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider"); 

2) sourceMetaData 인수

@Html.MvcSiteMap().Menu(new { name = "TopMenu" }) 
@Html.MvcSiteMap().Menu(new { name = "SideMenu" }) 
@Html.MvcSiteMap().Menu(new { name = "BottomMenu" }) 

3) here 바와 같이, 각 노드의 가시성 속성 세트를 통해 각 메뉴의 이름을 지정. HTML 도우미 유형으로 필터링 할 수도 있습니다.

<mvcSiteMapNode title="Home" controller="Home" action="Index" visibility="TopMenu,BottomMenu,SiteMapPathHelper,!*"> 
    <mvcSiteMapNode title="About" controller="Home" action="About" visibility="SideMenu,BottomMenu,SiteMapPathHelper,!*"/> 
    <mvcSiteMapNode title="Contact" controller="Home" action="Contact" visibility="TopMenu,SiteMapPathHelper,!*"/> 
</mvcSiteMapNode> 

더 복잡한 가시성 규칙이있는 경우에도 implement your own ISiteMapNodeVisibilityProvider을 사용할 수 있습니다.

가시성 또한 security trimming의 영향을 받지만 보안 트리밍은 항상 숨겨진 노드의 모든 자손 노드를 숨 깁니다. 보안 트리밍이 활성화되면 UI에서 볼 수 있도록 가시성 공급자에 따라 각 노드를 보안 성 있고 가시적으로 액세스 할 수 있어야합니다.

레벨을 기반으로하는 이동 경로 및 메뉴는 현재 페이지와 일치하는 노드가없는 경우 자동으로 숨겨집니다. 일치하는 동작에 대해 자세히 알아 보려면 How to Make MvcSiteMapProvider Remember a User's Position을 읽으십시오. 이는 "id"또는 기타 사용자 정의 매개 변수가있는 라우트에만 적용됩니다.

+0

도움이됩니다. 내 규칙은 충분히 간단합니다 - 메뉴 X는 모든 사람에게 표시되어야하며 메뉴 Y는 역할에 따라 표시되어야합니다. 그리고 MvcSiteMapProvider가 "역할 기반"을 잘 처리한다는 것을 이미 배웠습니다. –

+0

이것은 의도 한대로 작동하지 않았습니다. 내 사이트 맵 파일을 게시하겠습니다. –

+0

외부 DI 예제를 포함하도록 답변을 수정하고 수정했습니다. VisibilityAffectsDescendants를 false로 설정했는지 확인하십시오 (이전 예제에서는 true로 표시됨). 그렇지 않으면 메뉴에 보이지 않는 노드의 하위 노드가 숨겨집니다. 또한 탐색 경로의 항목을 항상 표시하려면 업데이트 된 항목 3을 참조하십시오. – NightOwl888

관련 문제