문제

사용자가 루트 노드 페이지에있을 때 SiteemAppath 컨트롤에서 루트 노드를 어떻게 숨길 수 있습니까? 예를 들어, 어린이 페이지의 빵 부스러크 트레일은 다음과 같습니다.

홈> 제품> 해머> 볼 펜

괜찮습니다. 그러나 사용자가 홈페이지에 있으면 SiteemAppath 컨트롤이 표시됩니다.

쓸모없는 혼란입니다. 사용자가 홈페이지에있을 때 집 (루트 노드)을 표시하고 싶습니다. 마스터 페이지에 SiteemAppath 컨트롤이 있습니다. 또한 SiteMapresolve를 처리하여 노드에서 쿼리 스트링을 설정합니다.

도움이 되었습니까?

해결책 3

나는 이것을 알아낼 수 있었지만 내가 가진 문제가 다소 미묘했기 때문에 시간이 걸렸다. Schou-Rode는 올바른 아이디어를 가지고 있으며 그것이 제가하고있는 일입니다. Page_Load 성공없이. 그것이 작동하지 않은 이유는 내가 노드를 복제했기 때문입니다. SiteMapResolve 클론을 반환합니다. 이것은 전에 발생했습니다 Page_Load 그래서 SiteMap.CurrentNode 클론과 비교를 참조했습니다 SiteMap.RootNode 실패한.

전체 솔루션은 다음과 같습니다.

protected void Page_Load(object sender, EventArgs e)
{
    SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}

private SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
{
    if (SiteMap.CurrentNode == null || SiteMap.CurrentNode == SiteMap.RootNode)
    {
        return SiteMap.CurrentNode;
    }
    // clone and set querystring in other nodes...
}

다른 팁

하나의 가능한 해결책은 간단히 숨기는 것입니다 SiteMapPath 홈페이지 제어 :

mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);

몇 가지 코드 기반 예제를 보았지만 다음은 루트 노드와 다음 Path-Separator를 숨길 수있는 Cheep CSS 솔루션 (대상 브라우저가 CSS 2.1을 지원해야합니다)이 있습니다.

Rootnodetemplate을 비워 두어 루트 노드를 죽입니다.

<asp:SiteMapPath ID="SiteMapPath1" runat="server" CssClass="breadCrumbTrail">
   <RootNodeTemplate></RootNodeTemplate>
</asp:SiteMapPath>

루트 노드에는 아무것도 렌더링되지 않지만 루트의 경로 분리기가 여전히 표시 되므로이 CSS 선택기를 스타일 시트에 추가하십시오 (중요 : 내 사이트에 대한 CSSclass라는 CSSclass를 제공했습니다.

.breadCrumbTrail
{
  font-size: small;
}

/*
First child element rendered by a SiteMapPath is an <a> tag you have no control over, 
adjacent to that is your root node's span tag, adjacent to that is the root node's 
path-separator span: don't display it.
*/
.breadCrumbTrail > a:first-child + span + span
{
  display: none;
}

SitemapDatasource에는 ShowStartingNode 속성도 있습니다. 루트 노드를 숨기려면 이것을 false로 설정하십시오.

홈페이지에서 아래 스크립트를 "헤드"부분에 추가하십시오.

protected void Page_Load(object sender, EventArgs e)
{
    SiteMapPath sp = (SiteMapPath)Master.FindControl("SiteMapPath1");
    sp.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}

위의 방법을 적용하려면 SiteMapPath1 마스터 페이지에 배치해야합니다.

3 가지 쉬운 단계에서 SiteMappath 루트 노트를 숨기는 올바른 방법 중 하나 :

  • ContentPage의 참조 마스터 페이지

    예시:

    <%@ MasterType VirtualPath="~/Master.master" %>
    
  • 디자이너 클래스에서 SiteemAppath를 보호 된 내부로 만드십시오

    예시:

    protected internal global::System.Web.UI.WebControls.SiteMapPath SiteMapPath1;
    
  • ContentPage에서 숨기십시오

    예시:

    Master.SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
    

나는 내 _layout.cshtml에 꽂았고 가장 쉬운 해결책은 제어 렌더링 블록 주위에 if 문 (이전에 제안 된 논리 포함)을 래핑하고 하루를 호출하는 것이 가장 쉬운 솔루션을 발견했습니다.

@if (SiteMap.CurrentNode != SiteMap.RootNode)
{
  @Html.MvcSiteMap().SiteMapPath()
}
<asp:SiteMapPath ID="contentNavigation" runat="server">
    <RootNodeTemplate>
    </RootNodeTemplate>
</asp:SiteMapPath>

및 CSS 코드 :

#ctl00_contentNavigation span:nth-child(2),span:nth-child(3)
{
    display:none;
}

최근에도 비슷한 문제가 있었지만 솔루션의 메뉴에 XMLDATASORCE를 사용하고 있습니다.

소스 XML의 샘플 구조 :

<root>
  <Menu text="" url=""/>
  <Menu text="" url=""/>
</root>

'루트'메뉴 항목을 표시하지 않으려면 xmldatasource에서 xpath 속성을 값으로 간단히 설정해야합니다. '/root/*'

ParentlevelsDisplayed = 0 도움이 될 것입니다

<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathSeparator="" 
        ParentLevelsDisplayed="0" >
        <RootNodeTemplate></RootNodeTemplate>            
    </asp:SiteMapPath>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top