技巧:在ASP.NET 2.0中建立網站導覽層次

來源:互聯網
上載者:User
asp.net|導航|技巧|網站

  網站導覽提供者--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屬性值。請注意,這個特性不支援更進階的規則(例如基於萬用字元和Regex的匹配)。

  樣本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>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.