홈페이지에서 SiteMappath 루트 노드를 어떻게 숨길 수 있습니까?
-
20-08-2019 - |
문제
사용자가 루트 노드 페이지에있을 때 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>