문제

저는 MVC SiteMap Provider를 사용하여 웹 사이트용 메뉴를 만들고 현재 메뉴 항목을 강조 표시하고 있습니다.

내 컨트롤러에는 색인, 세부 정보, 추가, 편집 및 삭제 방법이 있습니다.Index 및 Add 메서드만 메뉴 항목으로 사용할 수 있습니다.

세부 정보 작업에 있을 때 현재 기본 메뉴 항목(예: 제품)을 강조 표시하고 싶습니다.어떻게 해야 하나요?

나는 시도했다:

<mvcSiteMapNode title="Details" action="Details" visibility="IfSelected,!*" />

하지만 메뉴가 강조 표시되지는 않으며, 원하지 않더라도 세부 정보가 메뉴에 있습니다.

그런 다음 시도했습니다.

<mvcSiteMapNode title="Details" action="Details" visibility="IfSelected,!*" preservedRouteParameters="id" />

세부 정보 하위 메뉴가 강조 표시되어 있지만 메뉴에 세부 정보 하위 메뉴를 숨기고 기본 메뉴 항목('프로젝트')만 강조 표시하고 싶습니다.

도움이 되었습니까?

해결책

실제로 달성하려는 두 가지 개별 항목이 있지만 이를 하나의 질문으로 결합했습니다.

먼저 CRUD 작업을 수행하려면 기사를 살펴보십시오. MvcSiteMapProvder가 사용자 위치를 기억하도록 만드는 방법 그리고 그에 수반되는 다운로드 가능한 데모.구체적으로 다음과 같은 제목의 데모를 살펴보십시오. MvcSiteMapProvider-Forcing-A-Match 이는 노드를 중첩하는 방법, 현재 요청과 일치하도록 강제하고 가시성을 설정하고 선택한 레코드에 따라 노드의 제목을 동적으로 변경하는 방법을 정확하게 보여주기 때문입니다.

질문의 두 번째 부분은 기본 제공 기능을 사용하여 수행할 수 없는 메뉴 항목을 강조 표시하기 위해 출력 HTML을 변경하는 것에 관한 것입니다.이를 위해서는 /Views/Shared/DisplayTemplates/SiteMapNodeModel.cshtml 파일을 직접 편집해야 합니다.이 파일은 NuGet 패키지에 의해 MVC 프로젝트에 추가되므로 업그레이드할 때 변경 내용을 덮어쓰지 않도록 주의해야 합니다.이 파일은 Menu, SiteMap 및 SiteMapPath HTML 도우미에 의해 공유되므로 다음 중 하나를 수행해야 합니다. 메뉴판을 복사하다 또는 편집하려는 특정 HTML 도우미에 대해 항상 분기 논리를 사용하도록 주의하세요.

현재 페이지에 가장 가까운 일치 노드를 결정하려면 이 면도기 코드가 필요합니다.

@{var isClosestVisibleMenuItem = false;}
@if ((Model.IsCurrentNode || (Model.IsInCurrentPath && !Model.IsRootNode && !Model.Descendants.Any())) 
    && Model.SourceMetadata["HtmlHelper"].ToString() == "MvcSiteMapProvider.Web.Html.MenuHelper")
{
    isClosestVisibleMenuItem = true;
}

메뉴를 참조하고 있는지 확인하기 위해 SourceMetadata 값이 검사됩니다. 다른 모든 HTML 도우미는 항상 isClosestVisibleMenuItem 변수를 false로 설정합니다.

그런 다음 변수를 사용하여 템플릿에 출력할 HTML을 알려주기만 하면 됩니다.다음은 <b></b> 메뉴에서 가장 가까운 가시적 노드 주위에만 있습니다.실제 예에서는 앵커 태그를 강조하기 위해 특정 CSS 클래스를 앵커 태그에 추가하고 싶을 수도 있습니다.

@model MvcSiteMapProvider.Web.Html.Models.SiteMapNodeModel
@using System.Web.Mvc.Html
@using MvcSiteMapProvider.Web.Html.Models

@{var isClosestVisibleMenuItem = false;}
@if ((Model.IsCurrentNode || (Model.IsInCurrentPath && !Model.IsRootNode && !Model.Descendants.Any())) && Model.SourceMetadata["HtmlHelper"].ToString() == "MvcSiteMapProvider.Web.Html.MenuHelper")
{
    isClosestVisibleMenuItem = true;
}

@if (Model.IsCurrentNode && Model.SourceMetadata["HtmlHelper"].ToString() != "MvcSiteMapProvider.Web.Html.MenuHelper")  { 
    <text>@Model.Title</text>
} else if (Model.IsClickable) {

    if (isClosestVisibleMenuItem)
    {
        <b>
        @if (string.IsNullOrEmpty(Model.Description))
        {
            <a href="@Model.Url">@Model.Title</a>
        }
        else
        {
            <a href="@Model.Url" title="@Model.Description">@Model.Title</a>
        }
        </b>
    }
    else
    {
        if (string.IsNullOrEmpty(Model.Description))
        {
            <a href="@Model.Url">@Model.Title</a>
        }
        else
        {
            <a href="@Model.Url" title="@Model.Description">@Model.Title</a>
        }
    }
} else {
    if (isClosestVisibleMenuItem)
    {
        <b>@Model.Title</b>
    }
    else
    {
        <text>@Model.Title</text>   
    }
}

IfSelected는 계층 구조가 깊고 메뉴의 나머지 부분을 높은 수준으로 유지하면서 현재 경로(깊이에 상관없이)를 표시하려는 특정 사용 사례를 위한 것입니다.일반적으로 이는 메뉴에만 적용되며 다른 HTML 도우미에는 적용되지 않습니다.그러나 귀하의 질문에 대한 어떤 내용도 그것이 귀하가 달성하려는 것임을 암시하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top