Frage

Ich habe einen guten Blick über eine Last von MS-Dokumentation habe nur eine Baumansicht artige Struktur auf die Verwendung von XML-Sitemaps zu finden. Ich glaube nicht, dass jemand ist sich bewusst, wie es möglich ist, einen Ordner-ähnliche Struktur für Sitemap Navigation haben? Nehmen Sie zum Beispiel eine Struktur wie folgt

Home
   About
      Me.aspx
      MyFamily.aspx
      MyPets.aspx
   Contact
      Telephone.aspx
      Email.aspx
 Disclaimer.aspx

Die „About“ und „Kontakt“ Ordner sein würde, aber die Sitemap ist nie hierarchisch auf einer einzigen Seite. Also, ich würde meine Root-Seite mit zwei Menüpunkten hat, wäre ein „Home“ sein, die wie ein Ordner wirkt in die über und Kontakt Menüs zu Drilldown, und der andere ist ein Link auf der Seite für den Disclaimer. Ich möchte auf Start zu klicken, um die Lage sein, die das Menü mit den Links für „About“ und „Kontakt“ neugeladen und verstecken „Home“ und „Disclaimer“ zusammen.

Home >
Disclaimer

Dann auf nach Hause klicken und Sie erhalten würden

About >
Contact >

Dann, wenn Sie auf die über Sie würden bekommen

Me
My Family
My Pets

Jedes Menü würde ein „up“ Menü muß aus einem Ordner zurückkommen.

Ich kann es sehen, eine einfache Lösung zu sein, aber im Moment verwenden wir statische HTML-Seiten, die in verschiedenen Ordnern alle über unsere Web-Anwendung sind. Das ist etwas, als man sich vorstellen kann auch geändert werden muss.

Irgendwelche Ideen?

Bearbeiten

Ich habe mit einer VB.NET Lösung kommen

<script runat="server">
  Private Function GetSecondaryNavItems() As String
    Dim sRet As String = ""

    Dim oCurrNode As System.Web.SiteMapNode = Nothing
    Dim oCurrParentNode As System.Web.SiteMapNode = Nothing

    'Dim sCurrPage As String = GetURL(Request.ServerVariables("SCRIPT_NAME").ToLower())
    Dim sCurrPage As String = GetURL(HttpContext.Current.Request.ServerVariables("SCRIPT_NAME").ToLower())
    oCurrNode = GetCurrentNode(sCurrPage, SiteMap.RootNode)

    If Not oCurrNode Is Nothing Then
      oCurrParentNode = oCurrNode.ParentNode
    End If

    If Not oCurrParentNode Is Nothing Then
      If Not oCurrParentNode Is SiteMap.RootNode Then
        sRet += "Parent Folder Link"

        If Not oCurrNode Is Nothing Then
          For Each oChild As SiteMapNode In oCurrParentNode.ChildNodes
            sRet += "Link for child"
          Next
        End If
      End If
    End If

    Return sRet
  End Function

  Private Function GetURL(ByVal fullURL As String) As String
    Return fullURL.Substring(fullURL.LastIndexOf("/"))
  End Function

  Private Function GetCurrentNode(ByVal _sCurrentPageURL As String, ByVal _oNode As SiteMapNode) As SiteMapNode
    Dim oNodeRet As SiteMapNode = Nothing

    For Each oNodeCheck As SiteMapNode In _oNode.ChildNodes
      If oNodeCheck.HasChildNodes = True Then
        oNodeRet = GetCurrentNode(_sCurrentPageURL, oNodeCheck)
      End If

      If oNodeRet Is Nothing Then
        Exit For
      End If

      Dim sURL As String = oNodeCheck.Url.ToLower()
      Dim iPos As Integer = sURL.IndexOf("?")

      If iPos > 0 Then
        sURL = sURL.Substring(0, iPos)
      End If

      iPos = sURL.LastIndexOf("/")

      If iPos > 0 Then
        sURL = sURL.Substring(iPos)
      End If

      If sURL = _sCurrentPageURL Then
        oNodeRet = oNodeCheck
        Exit For
      End If
    Next

    Return oNodeRet
  End Function
</script>

Dies ist in der Master-Seite-Datei direkt (temporäres, ich habe es in dem Code hinter Modell platzieren es später).

Ich habe dann diese im Körper

<div id="sidebar">
  <%= GetSecondaryNavItems() %>
</div>

Auch hier vorübergehend nur zu testen. Es ist nicht tatsächlich ausgegeben etwas, aber dann ist meine GetURL Definition Ich denke nicht korrekt. Ich war die Annahme, es war nur die eigentliche Datei zu bekommen? Ich konnte sehr falsch sein, obwohl:)

EDIT EDIT : Aus irgendeinem Grund bin ich keine Ausgabe bekommen, so dachte ich, es meine Sitemap war. Ich werde es debuggen müssen, aber ich bin remoting im Moment in so ist es ziemlich langsam ist;)

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="Accounts/Default.aspx" title="Accounts"  description="Accounts">
    <siteMapNode url="Accounts/Test.aspx" title="Client Balances" description="Client Balances">
      <siteMapNode url="Hello.aspx" title="Hello"  description="rarar" />
      <siteMapNode url="Hiya.aspx" title="Hiya"  description="rarar" />
    </siteMapNode>
    <siteMapNode url="Test.aspx" title="Test"  description="rarar" />
  </siteMapNode>
</siteMap>

Hier ist das Beispiel Sitemap.

War es hilfreich?

Lösung

Sie können immer noch die Sitemap.sitemap Datei verwenden, um Ihre Navigation zu steuern, aber Sie würden keine der eingebauten Kontrollen in asp.net dies zu erreichen, verwenden. Ich habe gerade fast eben dies auf einer Seite, die ich gerade fertig.

Machen Sie alle Ihre Seiten von einer Basisseitenklasse erben (oder Masterseiten verwenden, so oder so nur 1 Kopie des Codes haben werden.)

Erstellen Sie eine div oder Spanne auf jeder Seite, mit dem Namen etwas Geeignetes (divNav oder spnNav oder was auch immer).

In Ihrer Basis Seite, auf Seite laden, eine Schleife durch alle Sitemap Knoten der aktuellen Seite des Knotens zu finden. Dies muss ein rekursiver Aufruf sein.

    // Pass the current page url, all the way through the .aspx.  In other words, do NOT pass any kind of 
    // query string.
    private SiteMapNode GetCurrentNode(string _sCurrentPageURL, SiteMapNode _oNode)
    {
        SiteMapNode oNodeRet = null;

        foreach (SiteMapNode oNodeCheck in _oNode.ChildNodes)
        {
            if (oNodeCheck.HasChildNodes == true)
            {
                oNodeRet = GetCurrentNode(_sCurrentPageURL, oNodeCheck);
            }

            if (oNodeRet != null)
                break;

            string sUrl = oNodeCheck.Url.ToLower();
            int iPos = sUrl.IndexOf("?");
            if (iPos > 0)
                sUrl = sUrl.Substring(0, iPos);
            iPos = sUrl.LastIndexOf("/");
            if (iPos > 0)
                sUrl = sUrl.Substring(iPos);

            if (sUrl == _sCurrentPageURL)
            {
                oNodeRet = oNodeCheck;
                break;
            }
        }
        return oNodeRet;
    }

Wenn Sie den aktuellen Knoten haben, bekommen ihre Eltern.

Fügen Sie einen Link (die „Menü aus einem Ordner zurück zu kommen“, wie Sie es genannt).

Sie dann eine foreach (SiteMapNode in parent.ChildNodes)

Fügen Sie einen Link für jedes der Kinder.

Also, unser Anruf, dass wir auf jeder Seite Last genannt, wie das war:

    public string GetSecondaryNavItems()
    {
        string sRet = "";

        // Get the node that matches most of this url...
        System.Web.SiteMapNode oCurrNode = null;
        System.Web.SiteMapNode oCurrParentNode = null;

        string sCurrPage = GetURL(Request.ServerVariables["SCRIPT_NAME"].ToLower());

        oCurrNode = GetCurrentNode(sCurrPage, SiteMap.RootNode);

        if(oCurrNode != null)
            oCurrParentNode = oCurrNode.ParentNode;

        if(oCurrParentNode != null)
              if(oCurrParentNode != SiteMap.RootNode)
                  sRet += "Parent Folder link";

            if(oCurrNode != null)
            {
            foreach (System.Web.SiteMapNode oChild in oCurrParentNode.ChildNodes)
            {
                    sRet += "Link for child";
              }
        }
    }

Ich muss Ihnen sagen, dass der Code über teilweise kopiert und ein Teil von mir freihändig ist. Aber das sollten Sie einen guten Start, ich würde denken.

EDIT: So sorry! Hier ist die GetURL proc ...

    public string GetURL(string _sURL)
    {
        string sRet = _sURL;

        int iPos = sRet.IndexOf("?");
        if (iPos > 0)
            sRet = sRet.Substring(0, iPos);
        iPos = sRet.LastIndexOf("/");
        if (iPos > 0)
            sRet = sRet.Substring(iPos);

        return sRet;
    }

Andere Tipps

Während ich nicht reagieren sollte würde ich tatsächlich etwas weiter dazu fragen. Ist es möglich, die genau die gleiche Sache zu tun, sondern mit einer Seite, die von einfach <ul> und <li> Elementen zusammengesetzt ist? Der Grund, warum ich frage ist, weil unsere „Sitemap“ ist eigentlich ein bisschen weiter fortgeschritten sowohl in Bezug auf Sicherheit und Funktionalität. Die Menüs wir tatsächlich dynamische Drop-Down-Listen mit Eingabefeldern haben laufen, das ist etwas, das nicht in einer Sitemap dupliziert werden kann.

So ist die Idee, die genau die gleiche Sache, außer mit einem tun

<ul>
   <li>
      <ul>
         <li></li>
      </ul>
   </li>
   <li></li>
   <li></li>
</ul>

Struktur statt. Der Wurzelknoten hätte eine Runat haben = „Server“ darauf, dass die Art und Weise Sie alle untergeordneten Elemente durchqueren könnte vielleicht? Auf diese Weise kann ich alles in meinen <li> und </li> Elementen setzen.

Unsere Sicherheit ist sehr zu sporadisch, was eine Sitemap nicht die Art von granularer Kontrolle hat wir entweder suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top