在 ASP.NET Web Pages (Razor) 網站中建立易讀的 URL
本文說明 ASP.NET Web Pages (Razor) 網站的路由,以及這如何讓您使用更容易閱讀且更適用於 SEO 的 URL。
您將學到什麼:
- ASP.NET 如何使用路由,讓您使用更容易閱讀且可搜尋的URL。
教學課程中使用的軟體版本
- ASP.NET Web Pages (Razor) 3
本教學課程也適用於 ASP.NET Web Pages 2。
關於路由
網站中頁面的 URL 可能會影響網站的運作流暢度。 「友善」的 URL 可讓使用者更容易使用網站。 它對網站的搜尋引擎最佳化 (SEO) 也有幫助。 ASP.NET 網站包含自動使用友善 URL 的功能。
ASP.NET 可讓您建立有意義的 URL,描述使用者動作,而不是只是指向伺服器上的檔案。 請想想虛構部落格的這些 URL:
http://www.contoso.com/Blog/blog.cshtml?categories=hardware
http://www.contoso.com//Blog/blog.cshtml?startdate=2009-11-01&enddate=2009-11-30
將這些 URL 與下列 URL 進行比較:
http://www.contoso.com/Blog/categories/hardware/
http://www.contoso.com/Blog/2009/November
在第一組中,使用者必須知道部落格是使用 blog.cshtml 頁面顯示的,然後必須建構可取得正確類別或日期範圍的查詢字串。 第二組範例更容易理解和建立。
第一個範例的 URL 也會直接指向特定檔案 (blog.cshtml)。 如果基於某些原因,部落格已移至伺服器上的另一個資料夾,或如果重新撰寫部落格以使用不同的頁面,則連結會錯誤。 第二組 URL 不會指向特定頁面,因此即使部落格實行或位置變更,URL 仍然有效。
在 ASP.NET Web Pages 中,因為 ASP.NET 使用路由,您可以建立更友善的 URL,如上述範例中的 URL。 路由會從 URL 建立邏輯對應到可滿足要求的網頁 (或頁面)。 因為對應是合乎邏輯的 (不是實體,指向特定檔案),因此路由提供您定義網站 URL 的絕佳彈性。
路由的運作原理
當 ASP.NET 處理要求時,它會讀取 URL 以判斷如何路由。 ASP.NET 嘗試比對磁碟上檔案的個別 URL 區段,從左至右。 如果有相符的,URL 中任何剩餘的會以路徑資訊的形式傳遞至頁面。
假設有人使用此 URL 提出要求:
http://www.contoso.com/a/b/c
搜尋會如下:
- 是否有路徑和名稱為 /a/b/c.cshtml 的檔案? 如果是,請執行該頁面,並不要傳遞任何資訊給該頁面。 否則...
- 是否有路徑和名稱為 /a/b.cshtml 的檔案? 如果是,請執行該頁面,並將值
c
傳遞至該頁面。 Otherwise - 是否有路徑和名稱為 /a.cshtml 的檔案? 如果是,請執行該頁面,並將值
b/c
傳遞至該頁面。
如果搜尋在指定的資料夾中找不到與 .cshtml 檔案完全相符的項目,ASP.NET 會依次繼續尋找這些檔案:
- /a/b/c/default.cshtml (沒有路徑資訊)。
- /a/b/c/index.cshtml (沒有路徑資訊)。
注意
清楚要求特定頁面 (也就是要求包含 .cshtml 副檔名) 的運作方式就如同您所預期。 http://www.contoso.com/a/b.cshtml
之類的要求將會精確地執行頁面 b.cshtml。
在頁面內,您可以透過頁面的UrlData
屬性取得路徑資訊,也就是字典。 假設您有名為 ViewCustomers.cshtml 的檔案,而有人向您的網站發出此要求:
http://mysite.com/myWebSite/ViewCustomers/1000
如上述規則所述,要求會移至您的頁面。 在頁面中,您可以使用類似下列的程式碼來取得並顯示路徑資訊 (在此案例中,值為「1000」):
<!DOCTYPE html>
<html>
<head>
<title>URLData</title>
</head>
<body>
Customer ID: @UrlData[0].ToString()
</body>
</html>
注意
因為路由不涉及完整的檔名,如果您有相同名稱但副檔名不同的頁面,可能會意義不明確 (例如 MyPage.cshtml 和 MyPage.html)。 為了避免路由問題,最好確定您的網站中沒有只有副檔名不同的頁面。
其他資源
WebMatrix - URL、URLData 和 SEO 的路由。 此部落格文章由 Mike Brind 針對路由在 ASP.NET Web Page 中如何運作提供一些額外的詳細資料。