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.
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.