关于ASP.NET 中站点地图sitemap 的使用
在ASP.NET? MVC 如此火熱的時期,我竟然不適時宜的談起ASP.NET ,恐怕會引來一陣嘲笑。最為無趣的是,講解的竟然還是其中的一個控件。oh~~? my god!my out! ^_^
?
SiteMapPath 控件簡介
SiteMapPath 控件是一種站點導航控件,反映了SiteMap 對象提供的數據。它提供了一種定位站點的方式,動態顯示當前頁在站點中的相對位置,并提供了從當前頁向上跳轉的快捷方式。
SiteMapPath 控件直接使用了站點地圖(.sitemap)中配置的數據(無需通過SiteMapDataSource數據源控件)。
?
示例一:SiteMapPath 控件的簡單使用
1、創建 Web.sitemap 文件
在您的網站的根目錄中創建一個名為 Web.sitemap 的文件。
打開此 Web.sitemap 文件,并添加下面的代碼:
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="Default.aspx" title="首頁" description=""> <siteMapNode url="Second.aspx" title="二頁" description="" /> <siteMapNode url="Third.aspx" title="三頁" description="" /> </siteMapNode> </siteMap>注意:
○? 如果在url 屬性值中,列出了不存在的 URL 或列出了重復的 URL,將導致請求Web 應用程序將失敗。
○? 如果在url 屬性值中,添加了相關參數(如:url="Second.aspx?id=1"),也有可能導致請求Web 應用程序將失敗。
○? 在url 屬性值中,可以“~/”快捷鍵開頭,該快捷鍵表示應用程序根目錄。
?
2、添加SiteMapPath 控件
向網頁Default.aspx 添加站點導航控件,其代碼如下:
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> <title>Simple Navigation Controls</title> </head> <body> <form id="form1" runat="server"> <h2>Using SiteMapPath</h2> <asp:SiteMapPath ID="SiteMapPath1" Runat="server"></asp:SiteMapPath> <!-- 此處的 SiteMapDataSource 控件是提供給TreeView 和 Menu 使用 --> <asp:SiteMapDataSource ID="SiteMapDataSource1" Runat="server" /> <h2>Using TreeView</h2> <asp:TreeView ID="TreeView1" Runat="Server" DataSourceID="SiteMapDataSource1" /> <h2>Using Menu</h2> <asp:Menu ID="Menu2" Runat="server" DataSourceID="SiteMapDataSource1"/> <h2>Using a Horizontal Menu</h2> <asp:Menu ID="Menu1" Runat="server" DataSourceID="SiteMapDataSource1" Orientation="Horizontal" StaticDisplayLevels="2" /> </form> </body> </html>注意:
○? 只要在頁面上拖放SiteMapPath 控件,頁面就會自動顯示站點地圖。
○? 此處代碼順便演示了SiteMapDataSource 控件如何提供給TreeView 和 Menu 使用。
?
示例二:如何在根站點地圖中添加子站點地圖文件
默認情況下,ASP.NET 站點導航使用一個名為 Web.sitemap 的 XML 文件,該文件描述網站的層次結構。
但是,也有可能要使用多個站點地圖文件或站點地圖提供程序來描述整個網站的導航結構。
?
1、若要為一個站點配置多個子站點地圖,首先在根目錄的站點地圖中設置子站點地圖的節點。
在根站點地圖Web.sitemap 中,將下面的 SiteMapNode 添加到文件的相應位置,代碼如下:
<siteMapNode siteMapFile="~/News/News.sitemap" />添加完以上節點后,根目錄下的站點地圖(Web.sitemap)的完整代碼如下:
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="Default.aspx" title="首頁" description=""> <siteMapNode url="Second.aspx" title="二頁" description="" /> <siteMapNode url="Third.aspx" title="三頁" description="" /> <siteMapNode siteMapFile="~/News/News.sitemap" /> </siteMapNode> </siteMap>?
2、添加子站點,并創建相應的子目錄的站點地圖文件(News.sitemap),其代碼如下:
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="~/News/NewsIndex.aspx" title="新聞首頁" description=""> <siteMapNode url="~/News/Sports.aspx" title="體育新聞" description="" /> <siteMapNode url="~/News/Stars.aspx" title="明星新聞" description="" /> </siteMapNode> </siteMap>注意:子站點地圖中,url 屬性值一定要使用以“~/”快捷鍵開頭的應用程序根目錄路徑,如:url="~/News/Stars.aspx"
?
示例三:如何動態修改站點地圖sitemap 中的屬性值
一個頁面的內容要根據上一個頁面所點擊的鏈接來動態改變,這個倒是可以通過頁面間的參數傳遞來實現。
但是,如果站點地圖(如:BBS.sitemap)中,相關節點 < siteMapNode > 的 title 屬性值也要根據所點擊的鏈接來動態改變,則需要通過一定的編碼來實現。
在此舉例如下:
一個論壇首頁(BBSIndex.aspx)上有相關版塊的超鏈接(如:Java 版塊鏈接、C# 版塊鏈接、SQL 版塊鏈接),點擊某一個版塊鏈接后,跳轉到論壇主題(Topic.aspx)頁面。而該論壇主題(Topic.aspx)頁面套用了一個模板頁(TopicMaster.master),該模板頁(TopicMaster.master)中添加了SiteMapPath 控件,該控件用來顯示當前頁面的版塊名稱,而該名稱的字符值是從站點地圖(BBS.sitemap)中相對應的節點(siteMapNode)取其 title 屬性值。
其站點結構如下圖所示:
?
BBS.sitemap 文件的代碼如下:
<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="~/BBS/BBSIndex.aspx" title="BBS首頁" description=""> <siteMapNode url="~/BBS/Topic.aspx" title="" description="" /> </siteMapNode> </siteMap>注意:url="~/BBS/Topic.aspx" 的節點siteMapNode 其title 屬性值為空字符串,它將通過在母版頁(TopicMaster.master)中編碼實現動態改變!
?
母版頁(TopicMaster.master)的后臺代碼如下:
public partial class BBS_TopicMaster : System.Web.UI.MasterPage { protected void Page_Load(object sender, EventArgs e) { //當訪問SiteMap.CurrentNode 屬性時發生 SiteMap.SiteMapResolve += new SiteMapResolveEventHandler(SiteMap_SiteMapResolve); Label1.Text = Request.QueryString["class"]; } SiteMapNode SiteMap_SiteMapResolve(object sender, SiteMapResolveEventArgs e) { //當在母版中獲得當前頁面的Request對象時,必須使用如下方法: HttpRequest currRequest = System.Web.HttpContext.Current.Request; string _classQuerySteing = currRequest.QueryString["class"]; if (null != _classQuerySteing) { /* SiteMap.CurrentNode對象是 BBS.sitemap 文件的當前節點值。 * 而SiteMap.CurrentNode 對象在SiteMap類中只讀, * 所以克隆一個SiteMapNode,并修改其對象的Title屬性值。 */ SiteMapNode currMapNode = SiteMap.CurrentNode.Clone(false); switch (_classQuerySteing) { case "java": currMapNode.Title = "Java 主題"; //currMapNode.Url = "Topic.aspx?class=java"; break; case "csharp": currMapNode.Title = "C# 主題"; break; case "sql": currMapNode.Title = "SQL 主題"; break; default: currMapNode.Title = "無主題"; break; } return currMapNode; } else { return SiteMap.CurrentNode; } } }注意:
○? 這里是通過在模板頁中給SiteMap 對象添加事件:SiteMap.SiteMapResolve += new SiteMapResolveEventHandler 以實現對站點地圖的動態修改,該事件將在當訪問SiteMap.CurrentNode 屬性時出發;
○? SiteMap.CurrentNode 對象是只讀的,我通過對該對象的克隆來復制一個SiteMapNode 節點,并修改其Title 屬性值。
轉自:http://www.cnblogs.com/xugang/archive/2010/12/01/1893260.html
示例下載:/Files/jhxk/Asp.net/SiteMap站點地圖.rar
轉載于:https://www.cnblogs.com/jhxk/articles/1894034.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的关于ASP.NET 中站点地图sitemap 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.net中的web.config配
- 下一篇: 微软应用架构指南(第2版)出版