在ASP.NET 2.0中建立站點導航層次

站點導航提供程序--ASP.NET 2.0中的站點導航提供程序暴露了應用程序中的頁面的導航信息,它允許你單獨地定義站點的結構,而不用考慮頁面的實際物理佈局。默認的站點導航提供程序是基於XML的,但是你也可以通過編寫自定義的提供程序,從任何後端位置暴露這些信息。

  站點導航API--站點導航API用於在應用程序的代碼中訪問站點導航信息,它摘錄了導航信息存儲的細節。你可以使用API來編程訪問應用程序的導航節點。

  導航控件--導航控件爲頁面之間的導航提供了通用的UI,例如樹視圖、菜單和breadcrumb("麪包屑",一種顯示當前所在頁面的控件)。這些控件利用ASP.NET 2.0中的站點導航服務來檢索你給站點定義的結構。SiteMapDataSource控件還允許你把其它UI控件綁定到站點導航數據。 

  網站經常需要顯示導航數據,來指導用戶如何使用站點。ASP.NET中的導航特性允許開發者簡單地定義導航數據,並根據這些信息來顯示UI。

  站點導航API是一種用於訪問站點導航數據的基於提供程序(provider)的編程內容。該API把導航數據存儲在XML文件中,並通過一組SiteMapNode類來暴露這些數據。應用程序和控件開發者可以構建SiteMapNode實例並使用這些信息來顯示導航界面。

  面向導航的服務器控件包括Menu、TreeView、SiteMapPath和SiteMapDataSource控件。這些控件都是建立在站點導航類的頂端的,它們使用和顯示導航數據的時候都是不考慮數據存儲的特定細節問題的。Menu和TreeView控件還可以使用XML文件的數據和XMLDataSource控件的數據。

  Url映射特性允許開發者爲不同URL請求的重映射(re-mapping)定義簡單的規則。

  使用站點導航控件

  Menu、TreeView、SiteMapPath和SiteMapDataSource控件根據導航數據生成導航界面。導航數據可以存儲在XML文件中,或者利用站點導航特性的基於提供程序的能力來保存。下面的例子演示瞭如何組合使用站點導航特性的不同控件。

  建立應用程序站點地圖

  示例的導航結構存放在Web.sitemap文件中,在下面你可以看到站點地圖文件。Web.sitemap文件包含一個頂層的<siteMap>元素。在<siteMap>元素內至少嵌套一個<siteMapNode>元素。在一個站點地圖內必須有一個頂層的<siteMapNode>。站點導航特性需要一個根<siteMapNode>來確保沿着節點層次的訪問最終匯聚到一個已知的節點。你可以在根<siteMapNode>元素下嵌套多個<siteMapNode>元素。此外,嵌套<siteMapNode>元素的深度是沒有限制的。

  一個<siteMapNode>元素通常包含Url(鏈接)、Title(標題)和Description(描述)屬性。Url屬性指明與應用程序中的頁面對應的路徑。它也可以包含其它應用程序中的頁面的路徑,或者指向完全不同的網站的多個URL。在下面的例子中,所有的Url屬性都使用應用程序相對語法來引用路徑。Title屬性用於顯示導航數據UI的文本內容。例如,SiteMapPath控件把Title屬性作爲控件的超鏈接文本顯示。如果提供了Description屬性,服務器控件就把顯示爲工具條提示或ALT文本。開發者也可以給<siteMapNode>添加自定義屬性,利用SiteMapNode類的默認索引器(indexer)就可以檢索這些屬性了。你可以查閱.NET框架組件文檔找到更多的關於<siteMapNode>元素其它一些屬性的信息。

  Web.sitemap的內容



<siteMap>
<siteMapNode title="Home" url="~/default.aspx" >
<siteMapNode title="Introduction to ASP.NET" url="~/introduction/default.aspx">
<siteMapNode title="What's New in Whidbey?" url="~/introduction/whatsnew.aspx"/>
<siteMapNode title="Sample Applications (Starter Kits)" url="~/introduction/starterkits.aspx"/>
<siteMapNode title="Introduction to Visual Web Developer" url="~/introduction/vwd.aspx"/>
</siteMapNode>
<siteMapNode title="Building A Web Application" url="~/development/default.aspx">
<siteMapNode title="Building a Simple Application" url="~/development/simple/default.aspx">
<siteMapNode title="Introduction to ASP.NET pages" url="~/development/simple/pages.aspx"/>
……
</siteMapNode>
</siteMapNode>
</siteMap>
  使用站點導航控件

  在Web頁面上提供站點導航的最簡單辦法就是使用圖形化的站點導航控件(SiteMapPath、TreeView和 Menu)。

  · SiteMapPath--一個breadcrumb控件,它檢索用戶的當前頁面並顯示頁面的層次結構。這讓用戶可以導航回層次中其它的頁面。SiteMapPath只能與SiteMapProvider一起使用,需要設置控件的SiteMapProvider屬性。

  · TreeView--在Web頁面上提供垂直的用戶界面,它可以展開和收縮選中的節點,也可以提供檢查框功能以供用戶選擇數據項。TreeView控件支持宣告式的或編程設置數據元素和數據源控件。如果你使用SiteMapDataSource控件,那麼數據綁定就是自動進行的。

  · Menu--提供水平的或垂直的用戶界面,當用戶把鼠標放在一項上的時候會彈出子菜單。Menu控件支持宣告式的或編程設置數據元素或數據源控件。如果你使用SiteMapDataSource控件,數據綁定就是自動進行的。

  請注意,TreeView和Menu控件都可以用於非導航的情形。

  下表描述了TreeView和Menu之間的差別,以便於你能根據需要做出適當的選擇。

特性 Menu TreeView 
擴展 彈出 位置擴展 
根據需要下載 No Yes 
檢查框 No Yes 
模板 Yes No 
佈局 水平 & 垂直 垂直 
Style選項 Yes Yes 
選擇模式 靜態的、 動態的層次 層次或父/根/葉,或按數據項 

  在下面的例子中,你看到的TreeView和Menu控件爲不同的區域和操作(例如NodeStyle和HoverNodeStyle)配置了一些樣式屬性。例子中的TreeView和Menu控件都連接到頁面上的同一個SiteMapDataSource控件。SiteMapPath控件通過Web.config文件中設置的默認的SiteMapProvider來訪問相同的數據。

<asp:treeview ID="TreeView1" ForeColor="White" DataSourceId="SiteMapDataSource1" NodeIndent="0" NodeStyle-ChildNodesPadding="10" runat="server">
<LevelStyles>
<asp:TreeNodeStyle Font-Bold="true"/>
<asp:TreeNodeStyle />
<asp:TreeNodeStyle Font-Size="x-small"/>
</LevelStyles>
<nodestyle forecolor="White" HorizontalPadding="5"/>
<SelectedNodeStyle backcolor="lightblue" forecolor="blue" />
<HoverNodeStyle Font-UnderLine="true" />
</asp:treeview>
<asp:sitemappath id="SiteMapPath1" runat="server" />
<asp:Menu ID="Menu1" DataSourceId="SiteMapDataSource1" runat="server">
<DynamicSelectedStyle BackColor="lightblue" ForeColor="Blue" />
<DynamicHoverStyle Font-Underline="true" />
<StaticHoverStyle Font-Underline="true" />
</asp:Menu>
<asp:sitemapdatasource id="SiteMapDataSource1" runat="server" />

  使用站點導航API

  站點導航API是使用可配置的提供程序訪問導航數據的編程抽象內容。站點導航提供程序把導航數據的存儲細節信息與API的其它部分隔離開來。站點導航API通過SiteMap和SiteMapNode類來暴露導航數據。SiteMap類返回與當前頁面對應的SiteMapNode實例。它還可以訪問那些爲站點導航特性配置的提供程序。SiteMapProvider爲執行下面一些事務提供了豐富的API:

  · 依據當前的HttpContext或任意URL檢索SiteMapNode實例。

  · 檢索SiteMapNode的父或子節點。

  · 訪問當前頁面的SiteMapNode,以及整個導航層次中的根SiteMapNode。

  · 執行授權規則,這樣就保證了提供程序只返回用戶可以看見的節點。

  SiteMapNode實例暴露的基本導航信息和功能包括:

  · URL、Title和description屬性,以及開發者給SiteMapNode添加的自定義屬性。

  · 獲取某個節點的父和子節點。

  · 在某個節點的前後節點之間進行導航。

  · 獲取SiteMapProvider實例的指針,它返回一個節點。

  ASP.NET發佈的時候帶有XmlSiteMapProvider提供程序。該提供程序使用XML文件(web.sitemap)中的數據,並根據數據返回SiteMapNode實例。XmlSiteMapProvider有下面一些功能:

  · 多個站點地圖(sitemap)文件可以鏈接在一起來構建一個"虛擬的"導航數據集合。

  · 多個XmlSiteMapProvider實例可以鏈接到一起來構建一個"虛擬的"導航數據集合。

  · 提供程序可以根據站點當前的文件授權和URL授權規則來返回過慮後的節點。

  有了SiteMapProvider指針之後,你就可以根據URL來檢索特定節點的站點導航數據。它會讓你獲取站點導航數據中的SiteMapNode實例指針。可以檢索任意SiteMapNode實例的能力和從任何SiteMapNode開始進行站點導航的能力組合在一起,使你能夠輕易地遍歷站點的導航數據。

  作爲一名開發者,你也可以把導航數據用其它的格式進行存儲(例如作爲關係數據存儲在數據庫中)。接着你應該構建一個衍生自SiteMapProvider的自定義提供程序。

  使用站點導航類編程

  你可以在代碼中編程獲取導航數據。編程獲取站點導航數據的出發點是SiteMap類。在這個類中有大量的靜態方法,其中最重要的一個是CurrentNode屬性。在網站的任何頁面中,你都可以調用SiteMap.CurrentNode來引用與當前的執行頁面相匹配的導航數據片斷。導航數據是用SiteMapNode實例的形式返回的--當你調用SiteMap.CurrentNode的時候,該屬性返回與當前頁面對應的SiteMapNode實例。站點導航特性根據存儲在XML文件中的導航數據返回正確的節點。

  下面的例子演示了一個帶有簡單的分頁功能的用戶控件。在顯示的頁面中,用戶控件位於頁面的底部中間。最初該鏈接的內容是"下一個主題"。當你點擊這個鏈接的時候,用戶控件調用SiteMapNode對象來檢測當前頁面的附近是否存在頁面。代碼檢測SiteMap.CurrentNode屬性,看它的前面是否有頁面(SiteMap.CurrentNode.PreviousSibling)、它的後面是否有頁面(SiteMap.CurrentNode.NextSibling)。如果存在頁面,用戶控件就顯示超鏈接,並把超鏈接的NavigateUrl屬性設置爲附近節點的Url屬性。

  如果你點擊頁面左部的Treeview鏈接,可以看到用戶控件是如何自動地顯示適當的"前一個主題"和"後一個主題"鏈接的。用戶控件還顯示了另外一個超鏈接,你可以點擊它返回主頁。如果你查看這個超鏈接如何工作就會發現,該控件利用了主頁<siteMapNode>元素中的自定義屬性"customAttribute"。該控件演示瞭如何使用SiteMapNode的默認索引器來檢索自定義屬性的值。



<script language="VB" runat="server">
Sub Page_Load()
If (Not SiteMap.CurrentNode.NextSibling Is Nothing) Then
NextTopic.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url
Else
NextTopic.Visible = false
Separator.Visible = false
End If

If (Not SiteMap.CurrentNode.PreviousSibling Is Nothing)
PrevTopic.NavigateUrl = SiteMap.CurrentNode.PreviousSibling.Url
Else
PrevTopic.Visible = false
Separator.Visible = false
End If

'使用FindSiteMapNode查找URL中的節點並提取一些信息
Dim rootNode as SiteMapNode = SiteMap.Provider.FindSiteMapNode("~/Home.aspx")
GoHome.NavigateUrl = rootNode.Url
GoHome.ToolTip = rootNode.Description
GoHome.Text = rootNode("customAttribute")
End Sub
</script>

  站點導航的安全性

  站點導航特性可以根據授權規則過慮提供程序所返回的SiteMapNode實例。XmlSiteMapProvider可以根據當前網站使用的文件和URL授權規則過慮節點。

  下面的例子使用了窗體授權規則,預定義的用戶憑證存儲在web.config中。在global.asax中,根據用戶名,用戶的角色都被附加到當前的請求上。在web.config中,嵌套在<siteMap>元素之下的站點地圖提供程序使用的<add>元素的securityTrimmingEnabled屬性被設置爲真。同時,web.config文件的末尾定義了一組URL授權規則。當你運行示例並登陸之後,XmlSiteMapProvider會自動地依據用戶所屬的角色和web.config中定義的授權規則來對SiteMapNode執行授權檢測。

  請使用下面三個帳戶之一運行示例:

  · Userid: SectionOne Password: SectionOne 
  · Userid: SectionTwo Password: SectionTwo 
  · Userid: AllSections Password: AllSections 

  在頁面的右上角有一個"退出"鏈接,因此你可以用不同的帳號登陸和退出。請注意,根據你登陸所使用的帳號不同,導航UI顯示的Treeview和Menu控件會自動地反映該用戶所獲得的訪問權限。提供程序自動地過慮了返回的節點--實現這種功能不需要額外的代碼。用"SectionOne"帳號登陸的時候,只在左邊的Treeview控件中顯示"SectionOne"鏈接和外部鏈接。用"SectionTwo"帳號登陸的時候,只在左邊的Treeview控件中顯示"SectionTwo"鏈接和外部鏈接。用"AllSections"帳號登陸的時候,Treeview控件中顯示了所有的鏈接。web.config中的授權規則配置爲給"SectionOne"和"SectionTwo"層次授予了部分訪問權力。

  這個示例還演示瞭如何處理應用程序目錄範圍之外的URL安全性。在web.sitemap文件中,外部鏈接的節點使用了roles屬性。語法roles="*"授予所有用戶訪問和查看導航控件中的節點的權力。語法roles="Adminstrators,Regular Users"只允許這些角色的用戶檢索和查看導航控件中的節點。由於在示例中global.asax文件把用戶分成了這兩種角色,所以你一直可以看到外部鏈接。

  開發者可以選擇同時使用文件/URL授權規則和roles屬性來控制用戶對SiteMapNode實例的訪問權。如果兩者的設置信息都是正確的,站點導航提供程序就會根據文件/URL授權規則和roles屬性中的角色來對當前用戶進行認證。如果當前用戶通過了任何一種授權檢查,就可以訪問節點。

  如果默認的安全性操作不適用於你的應用程序,開發者還可以從XmlSiteMapProvider衍生類,並用自定義的節點授權實現來重載IsAccessibleToUser方法。

  Web.config的內容



<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="Login.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true" defaultUrl="Home.aspx" cookieless="UseCookies" enableCrossAppRedirects="false">
<credentials passwordFormat="Clear">
<user name="SectionOne" password="SectionOne"/>
<user name="SectionTwo" password="SectionTwo"/>
<user name="AllSections" password="AllSections"/>
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
<location path="SectionOne.aspx">
<system.web>
<authorization>
<allow users="SectionOne" roles="Administrators" />
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="SectionOne">
<system.web>
<authorization>
<allow users="SectionOne" roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="SectionTwo.aspx">
<system.web>
<authorization>
<allow users="SectionTwo" roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="SectionTwo">
<system.web>
<authorization>
<allow users="SectionTwo" roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>

  本地化站點地圖數據

  存儲在sitemap文件中的導航數據可能需要進行本地化(localize)。<siteMapNode>元素中的URL、Title和Description屬性也可以本地化。此外,開發者放置在<siteMapNode>元素中的任何自定義屬性也可以本地化。

  下面的示例包含了英語和法語的本地化文本。它的web.sitemap文件使用兩種類型(隱式的和顯式的)的本地化表達式來實現這種功能。Sitemap文件在根siteMap元素中使用了enableLocalization=true就表明它使用了本地化數據。

  站點地圖文件的隱式表達式讓開發者能夠輕易地用查找鍵(lookup key)標記每個<siteMapNode>元素,而查找鍵是用於從資源文件檢索資源的。在示例的web.sitemap中,除了第一個節點之外,所有的節點都有隱式的資源表達式。它的語法類似resourceKey="Autos"。當XmlSiteMapProvider根據web.sitemap文件中的信息檢索SiteMapNode的時候,它根據SiteMapNode屬性的名稱、resourceKey和爲提供程序配置的siteMapFile屬性的值來檢索字符串資源。使用示例中的"Autos"節點的時候,提供程序(provider)會根據當前的文化來查找以"web.sitemap"開頭的資源文件。這意味着,對於一個發送法語頭信息的瀏覽器來說,提供程序會查找名稱爲web.sitemap.fr.resx的資源文件。在這個資源文件中,提供程序會依據resourceKey + "." + [SiteMapNode屬性名]來查找資源鍵。例如,把"Autos"節點的Title屬性當作例子,提供程序會在web.sitemap.fr.resx資源文件中查找鍵爲Autos.Title的資源。

  顯式表達式使開發者對包含本地資源的文件和資源鍵(resource key)的名稱有更強的控制能力。在示例web.sitemap中,第一個<siteMapNode>元素使用了顯式資源表達式。顯式表達式在每個屬性上指定。第一個<siteMapNode>元素的Title屬性使用了顯式表達式。顯式表達式必須以$resource:開頭。在這個標識符之後,開發者必須提供資源文件的根名稱和資源鍵。開發者可以選擇提供一個默認值。在例子中,表達式$resources: Title, MyTitle , Home表明提供程序應該查看以"Title"開頭的資源文件。對於發送法語頭信息的瀏覽器開說,提供程序會查找Title.fr.resx資源文件。接下來提供程序查看鍵爲MyTitle的資源。如果提供程序無法找到這種資源,它會把字符串"Home"作爲默認值。

  你可以運行示例來查看站點地圖本地化的效果。把英語作爲默認語言的瀏覽器會顯式英語文本。如果使用IE,你可以通過點擊"工具->Internet選項",並在"通用"選項卡點擊"語言"按鈕,點擊"添加"按鈕並選擇添加"法語"。如果需要,還需要選中法語並點擊"向上移動"按鈕,使它成爲IE的默認請求語言。把默認的語言改成法語之後,刷新示例頁面。請注意,Menu、Treeview和SiteMapPath控件中的文本自動地顯式爲App_GlobalResources目錄中存放的法語資源文件中的法語文本。

  Web.sitemap的內容



<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" enableLocalization="true">
<siteMapNode url="~/Default.aspx" title=" $resources: Title, MyTitle , Home" description="Default page description when no localized value exists." >
<siteMapNode url="~/Category.aspx" resourceKey="Category">
<siteMapNode title="Autos" description="Autos" url="~/Autos.aspx" resourceKey="Autos" />
<siteMapNode title="Games" description="Games" url="~/Games.aspx" resourceKey="Games" />
<siteMapNode title="Health" description="Health" url="~/Health.aspx" resourceKey="Health" />
<siteMapNode title="News" description="News" url="~/News.aspx" resourceKey="News" />
</siteMapNode>
</siteMapNode>
</siteMap>

  修改提供程序(Provider)返回的站點導航數據

  存儲在web.sitemap中、供XmlSiteMapProvider使用的導航數據是靜態的--這些數據被載入內存中並作爲只讀數據存儲。但是,很多站點的導航結構是根據查詢字符串的值來參數化的。例如,新聞組(newsgroup)站點可能擁有良好定義的頁面結構(例如,主頁、新聞類別頁面和新聞內容頁面),但是實際的內容可能會有很大的不同,這依賴於查詢字符串中的標識符。儘管把每種可能的查詢字符串值都存儲在<siteMapNode>元素中也是可能的,但是即使是中等數量的查詢字符串值,也要求sitemap文件包含數百個<siteMapNode>元素。

  站點導航特性在SiteMapProvider基類中暴露了SiteMapResolve事件。可以使用SiteMap.SiteMapResolve或直接使用提供程序SiteMap.Provider.SiteMapResolve來執行這個事件。這個事件的返回值是一個SiteMapNode實例。你可以在自己的事件處理程序中編寫自定義邏輯來建立SiteMapNode實例的層次結構。這個邏輯可以修改每個SiteMapNode的屬性,因此URL和Title等屬性會反映查詢字符串帶有的數據信息。

  下面的例子在global.asax中註冊了一個事件處理程序。這個事件處理程序的代碼是App_Code目錄中的一個類。這個自定義的類複製與當前頁面對應的SiteMapNode實例。XmlSiteMapProvider返回的節點都是隻讀的,而調用SiteMapNode上的Clone方法返回的是可寫入的節點。在實例中,如果給Clone傳遞了true值,將導致當前的SiteMapNode和它的所有父節點都是可寫入的。這個類的代碼的其它部分檢查當前的頁面和當前頁面的查詢字符串,確定當前頁面位於站點層次結構的什麼位置。代碼修改了URL和Title屬性,包含一些額外的信息,這樣SiteMapPath控件顯示的導航UI就反映了網站用戶爲到達當前頁面的實際點擊路徑。

  運行示例的時候,你開始位於站點的主頁。SiteMapPath控件也反映了這一點。點擊任何鏈接都會帶你進入分類頁面,它顯示相關新聞類別中的新聞鏈接。請注意,如果你把鼠標停留在SiteMapPath控件的最後一個鏈接上,瀏覽器狀態欄中顯示的URL包含了查詢字符串信息(它指定了新聞類別)。點擊任何一個發佈鏈接都會把你帶回到新聞發佈頁面。如果你把鼠標停留SiteMapPath控件的鏈接上,可以注意到控件中的最後兩個鏈接帶有的URL和Title包含了點擊路徑的正確查詢字符串和描述信息。如果你導航到站點的主頁,並點擊其它的新聞組和內容鏈接,SiteMapPath控件會被更新並反映第二次點擊的鏈接。



Public Class PathExpansionHandler
Public Shared Function ExpandPath(ByVal sender As Object, ByVal e As SiteMapResolveEventArgs) As SiteMapNode
'獲取當前和之前節點的引用
Dim nodeCopy As SiteMapNode = SiteMap.CurrentNode.Clone(True) 
Dim tempNode As SiteMapNode = nodeCopy 

'Check if there is a newsgroup type in the query string
Dim typeID As String = Nothing 
Dim typeIDUrlEncoded As String = Nothing 
If Not String.IsNullOrEmpty(e.Context.Request.QueryString("type")) Then
typeID = e.Context.Server.HtmlEncode(e.Context.Request.QueryString("type"))
typeIDUrlEncoded = e.Context.Server.UrlEncode(e.Context.Request.QueryString("type"))
End If

'首先執行發佈頁面URL的固定
'如果查詢字符串中包含發佈ID,我們就知道當前節點式發佈頁面
If Not String.IsNullOrEmpty(e.Context.Request.QueryString("postingID")) Then
Dim postingID as string = _
e.Context.Server.HtmlEncode(e.Context.Request.QueryString("postingID"))
Dim postingIDUrlEncoded as string = _
e.Context.Server.UrlEncode(e.Context.Request.QueryString("postingID"))
Dim NewUrl As String = tempNode.Url + "?type=" + typeIDUrlEncoded + "&postingID=" + postingIDUrlEncoded 
Dim NewTitle As String = tempNode.Title + ": " + postingID 
tempNode.Url = NewUrl
tempNode.Title = NewTitle

tempNode = tempNode.ParentNode
End If

'然後,對新聞組頁面進行固定
'這時候nodeCopy 變量知賢了新聞組節點
If Not String.IsNullOrEmpty(e.Context.Request.QueryString("type")) Then
Dim NewUrl As String = tempNode.Url + "?type=" + typeIDUrlEncoded 
Dim NewTitle As String = tempNode.Title + ": " + typeID 
tempNode.Url = NewUrl
tempNode.Title = NewTitle
End If

'最後返回當前節點
Return nodeCopy
End Function
End Class
  URL映射

  URL映射特性利用web.config中存儲的配置信息把收到的請求重映射(remap)到不同的URL。重映射發生在對請求的所有其它處理操作之前。下面的例子演示的是重映射一個頁面請求,實際上任意文件類型都可以把請求重映射到不同的URL。

  定義重映射URL

  URL映射的配置信息存儲在web.config中。<urlMappings >元素中嵌套的每個<add>元素爲重映射進入站點的(inbound)url定義了一條規則。url屬性定義了進入站點的url的exact(原樣)屬性,URL映射特性會試圖用它進行匹配操作。如果exact匹配操作發生了,就會給進入站點的URL重新寫入mappedUrl屬性值。請注意,這個特性不支持更高級的規則(例如基於通配符和正則表達式的匹配)。 

  示例web.config爲大量的url定義了映射規則。示例使用的web.sitemap文件定義的大量帶有URL值的節點都會被重映射。其結果是,URL映射和站點導航的組合使用,使得開發者可以用友好的url來定義導航結構,並使用URL映射把請求重新寫到不同的頁面來執行實際的處理過程。

  當你運行示例的時候,請注意Menu和Treeview控件是如何根據web.sitemap文件中定義的站點結構來顯示導航數據的。如果你把鼠標停留在Treeview控件或右上角的SiteMapPath控件的鏈接上方,狀態欄中顯示的url是一個友好的url鏈接。當你點擊任何導航鏈接的時候,實際運行的頁面是Default.aspx。但是,Menu、Treeview和SiteMapPath控件中的導航信息仍然反映爲友好的URL結構。

  在頁面的底部你還可以看到Request.Path、Request.QueryString["category"]和Request.RawUrl返回的值。Request.Path和Request.QueryString["category"]返回的值一直反映重映射進入站點的url的結果。但是,Request.RawUrl的值反映了重映射之前的友好的url。當站點導航特性試圖把url信息與sitemap文件包含的數據進行匹配的時候,它會使用Request.RawUrl。如果匹配的值沒有找到,XmlSiteMapProvider就把Request.Path作爲替代者。在例子中,所有的友好url在web.sitemap文件中都有條目,因此使用站點導航的控件一直根據友好的url來顯示和引用節點。

<?xml version="1.0" ?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.web>
<urlMappings enabled="true">
<add url="~/Category.aspx" mappedUrl="~/Default.aspx?category=default" />
<add url="~/Autos.aspx" mappedUrl="~/Default.aspx?category=autos" />
<add url="~/Games.aspx" mappedUrl="~/Default.aspx?category=games" />
<add url="~/Health.aspx" mappedUrl="~/Default.aspx?category=health" />
<add url="~/News.aspx" mappedUrl="~/Default.aspx?category=news" />
</urlMappings>
</system.web>
</configuration>
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章