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.

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top