Come posso nascondere il nodo principale di SiteMapPath sulla home page?
-
20-08-2019 - |
Domanda
Come posso nascondere il nodo principale in un controllo SiteMapPath quando l'utente si trova nella pagina del nodo principale? Ad esempio, la mia traccia breadcrumb su una pagina figlio è:
Home > Prodotti & Gt; Martelli & Gt; Ball Peen
che va bene. Ma quando l'utente si trova nella Home page, viene visualizzato il controllo SiteMapPath
Home
che è disordine inutile. Voglio sopprimere la visualizzazione di Home (il nodo principale) quando l'utente è nella home page. Ho il controllo SiteMapPath in una pagina master. Inoltre, sto gestendo SiteMapResolve per impostare le stringhe di query nei nodi.
Soluzione 3
Sono riuscito a capirlo, ma ci è voluto un po 'perché il problema che stavo avendo era un po' sottile. schou-rode ha l'idea giusta ed è quello che stavo facendo in Page_Load
senza successo. Il motivo per cui non funzionava è perché stavo clonando il nodo in SiteMapResolve
e restituendo il clone. Ciò si è verificato prima di SiteMap.CurrentNode
, pertanto SiteMap.RootNode
ha fatto riferimento al clone e il confronto con <=> non è riuscito.
Ecco la soluzione completa:
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...
}
Altri suggerimenti
Una possibile soluzione sarebbe semplicemente nascondere il SiteMapPath
controllo sulla home page:
mySiteMapPath.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
Ho visto alcuni esempi basati su codice, ma ecco una soluzione CSS parsimoniosa (i tuoi browser di destinazione devono comunque supportare css 2.1) che nasconderà il nodo radice e il seguente separatore di percorso.
Uccidi il nodo Root impostando RootNodeTemplate su vuoto in questo modo:
<asp:SiteMapPath ID="SiteMapPath1" runat="server" CssClass="breadCrumbTrail">
<RootNodeTemplate></RootNodeTemplate>
</asp:SiteMapPath>
Ciò non renderà nulla per il nodo Root, ma il separatore di percorsi della Root verrà comunque visualizzato, quindi aggiungi questi selettori CSS al tuo foglio di stile (Importante: nota che ho dato al mio elemento SiteMapPath1 una CssClass chiamata 'breadCrumbTrail'):
.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;
}
Esiste anche una proprietà ShowStartingNode su SiteMapDataSource. Impostalo su false per nascondere il nodo principale.
Nella home page, aggiungi lo script seguente al " head " parte:
protected void Page_Load(object sender, EventArgs e)
{
SiteMapPath sp = (SiteMapPath)Master.FindControl("SiteMapPath1");
sp.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
}
Per applicare il metodo sopra, SiteMapPath1
deve essere inserito nella MasterPage.
Quello del modo giusto per nascondere la nota radice di SiteMapPath in 3 semplici passaggi:
-
Pagina principale di riferimento da ContentPage
Esempio:
<%@ MasterType VirtualPath="~/Master.master" %>
-
Imposta SiteMapPath come interno protetto in classe designer
Esempio:
protected internal global::System.Web.UI.WebControls.SiteMapPath SiteMapPath1;
-
Nascondi da ContentPage
Esempio:
Master.SiteMapPath1.Visible = (SiteMap.CurrentNode != SiteMap.RootNode);
Avevo inserito il mio nel mio _Layout.cshtml e ho scoperto che la soluzione più semplice era avvolgere un'istruzione If (con la logica precedentemente suggerita) attorno al blocco di rendering del controllo e chiamarla un giorno:
@if (SiteMap.CurrentNode != SiteMap.RootNode)
{
@Html.MvcSiteMap().SiteMapPath()
}
<asp:SiteMapPath ID="contentNavigation" runat="server">
<RootNodeTemplate>
</RootNodeTemplate>
</asp:SiteMapPath>
e codice css:
#ctl00_contentNavigation span:nth-child(2),span:nth-child(3)
{
display:none;
}
Di recente ho avuto un problema simile, ma sto usando XmlDataSource per il menu nella mia soluzione.
Struttura di esempio dell'XML di origine:
<root>
<Menu text="" url=""/>
<Menu text="" url=""/>
</root>
Se NON si desidera visualizzare la voce di menu 'root', è necessario impostare semplicemente la proprietà XPath su XmlDataSource sul valore '/ root / *'
ParentLevelsDisplayed = 0 aiuterà
<asp:SiteMapPath ID="SiteMapPath1" runat="server" PathSeparator=""
ParentLevelsDisplayed="0" >
<RootNodeTemplate></RootNodeTemplate>
</asp:SiteMapPath>