在ASP.Net我通常使用標準web.sitemap
文件開我的主導航如下列:到ASP.Net在PHP web.sitemap中最佳替代
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="~/index.html" title="My Awesome Site">
<siteMapNode url="~/About/index.html" title="About">
<siteMapNode url="~/About/Board.html" title="Board"/>
<siteMapNode url="~/About/Vision.html" title="Vision"/>
<siteMapNode url="~/About/Mission.html" title="Mission"/>
<siteMapNode url="~/About/Support.html" title="Support"/>
<siteMapNode url="~/About/Locations.html" title="Locations"/>
<siteMapNode url="~/About/Funding-Sources.html" title="Funding Sources"/>
<siteMapNode url="~/About/Volunteer.html" title="Volunteer"/>
<siteMapNode url="~/About/Staff.html" title="Staff"/>
</siteMapNode>
<siteMapNode url="~/Parents/index.html" title="Parents">
<siteMapNode url="~/Parents/Child-Development.html" title="Child Development"/>
<siteMapNode url="~/Parents/Referrals.html" title="Referrals"/>
</siteMapNode>
<siteMapNode url="~/Resources/index.html" title="Resources">
<siteMapNode url="~/Resources/Resource-Library.html" title="Resource Library"/>
<siteMapNode url="~/Resources/Links.html" title="Links"/>
</siteMapNode>
</siteMapNode>
</siteMap>
然後我通常創建用於用戶控制導航,我可以使用SiteMap.CurrentNode
和/或SiteMap.CurrentNode.IsDescendantOf
將當前頁面標記爲「已選」或其他內容。我正在尋找類似於PHP的東西。在ASP經典中,我們幾乎不得不使用include和一組if
語句,但是一旦深入幾級,就會得到一堆代碼。我可能會在每個頁面的頂部創建變量,指定我們正在使用哪個「部分」,「子部分」和「頁面」,但如果可能的話,我想避免這種情況。
我發現this link它通過查詢字符串反彈的事情,但是這不是一個選項。
如果有誰不熟悉web.sitemap
文件,如果需要,我可以解釋它的更多細節。
編輯 - 評論對@BrandonS
什麼我要找的核心是能夠定義一個代表我的網站頁面的單個文件。 ASP.Net使用一個XML文件,它很方便捕捉一些潛在的錯誤,但不是必需的。理想情況下,我實際上想使用ASP.Net使用的完全相同的文件格式,以便我可以共享代碼,但仍不是絕對必需的。
在ASP.Net中,使用上面的站點地圖,我將有一個用戶控件(基本上是一個榮耀的包含文件),它在每個頁面上輸出<title>
標記。在主頁頁它會輸出只是My Awesome Site
,該關於 L2它會輸出My Awesome Site - About
頁和董事會 L3它會輸出My Awesome Site - About - Board
頁面上。子頁面上的麪包屑可能會使用同樣的想法。 (快速預留,爲我所有的網站頁面只出現一次,因此沒有有兩個家長頁的機會。)
在ASP.Net每個頁面請求的地圖對象被自動創建。 (其實我覺得它的惰性加載意味着它實際上還沒有生成,除非您嘗試訪問,但這種情況發生透明。)因此,在任何給定的時刻,我可以存在於Sitemap文件的任何頁面上使用SiteMap.CurrentNode
對象。 (如果頁面沒有在網站地圖文件返回null
存在)。從我可以要求SiteMap.CurrentNode.ParentNode
或者我可以走了SiteMap.CurrentNode.ChildNodes
。我也可以獲得代表站點地圖文件根目錄的SiteMap.RootNode
。從那我可以走SiteMap.RootNode.ChildNodes
知道這些直接的孩子代表我的網站的2級頁面。然後,我可以單獨行走這些孩子,知道每個「孫子」代表一個L3等等。
因此,使用上述遞歸我可以走根節點的孩子定義我的網站的主要導航,如果我在我的資產淨值有下拉菜單然後我就可以走子兒。在步行孩子或孫輩時,我可以根據SiteMap.CurrentNode
是否等於或小孩或孫子的後代來設置課程。下面是VB中的一個例子。我如何使用站點地圖爲建設L2導航網:
''//An array that we append potential CSS class names to such as "first" or "active"
Dim Classes As List(Of String)
''//A StringBuild is just an efficient way to work with Strings
''//if you are not familiar with it just now that Append() is basically "&=" and AppenLine() is basically "&= ...\n"
Dim Buf As New StringBuilder()
Buf.AppendLine(" <ul>")
''//Walk the root child nodes, the N variable will be the current ChildNode of the SiteMap.RootNote
For Each N As SiteMapNode In SiteMap.RootNode.ChildNodes
''//For the first and last child we want to add extra classes in case we need to adjust borders, padding, etc
Classes = New List(Of String)
If N.PreviousSibling Is Nothing Then
Classes.Add("first")
ElseIf N.NextSibling Is Nothing Then
Classes.Add("last")
End If
''//See if the page being requested is the current child or if the current page is descended from it so that we can mark it as active
If SiteMap.CurrentNode IsNot Nothing Then
If SiteMap.CurrentNode.Equals(N) OrElse SiteMap.CurrentNode.IsDescendantOf(N) Then
Classes.Add("active")
End If
End If
''//This code below is just for outputting the <li class="..."><a href="...">...</a></li> code
''//Write the opening list tag
Buf.Append(" <li")
''//If the above code created any CSS classes append the class attribute and the space-delimited list of classes
If Classes.Count > 0 Then
Buf.Append(" class=""" & Join(Classes.ToArray(), " ") & """")
End If
''//Close the list tag
Buf.Append(">")
''//Append the hyperlink. The "N" object is the current child of the SiteMap.RootNode.ChildNodes
''//All SiteMapNode objects have a Url property and a Title property which is defined in the XML file
Buf.AppendFormat("<a href=""{0}"">{1}</a></li>", N.Url.Replace("/index.html", "/"), HttpUtility.HtmlEncode(N.Title))
''//Append a blank line, I like to keep my code formatted nicely
Buf.AppendLine()
Next
''//Append the closing list tag
Buf.AppendLine(" </ul>")
附加說明
有些人可能會認爲這是矯枉過正,但是這是所有內置的.Net,這就是爲什麼我詢問是否存在PHP的東西。我可以推出自己的產品,但顯然我希望儘可能避免使用它。
Chris我認爲我可以提供幫助,但是因爲PHP中沒有ASP類的直接端口,因此無法直接訪問正確的PHP類,因此我正在尋找的主要功能是什麼,因爲我知道20這將滿足大多數ASP類的規範,但如果你將成爲一組特定的函數,我可以建議更適合你。我想我在說你想做什麼? – BrandonS 2011-05-06 16:45:33
如果你想使用一個完全像ASP的web.sitemap文件,你將需要編寫一個類來執行此操作。大多數框架都有內置的東西來處理導航。所以也許告訴我們你使用的是什麼框架會有所幫助。 Zend,Symphony,Cake,CodeIgniter? – 2011-05-06 19:07:51
@BrandonS,我回答了上面的一些細節。 @Harmon Wood,我通常以Zend框架爲目標。對於每個人來說,我知道我可以推出我自己的XML解析代碼,我只是希望不能構建某人已經做過的事情,並且迄今爲止我的搜索沒有返回任何內容。此外,我不希望整個CMS(WordPress,Joomla等),我只是尋找一個導航助手。 – 2011-05-06 19:29:13