站點地圖的設計基於一個簡單的原則:每個入口具有一個單獨的 URL。雖然可以增加查詢字符串區分 URL,但在很多網站 Web 表單和站點地圖入口是一一對應的。
當這個原則不適用時,ASP.NET 有兩個工具可以解決這一問題:
- URL 映射。它以整潔、合乎邏輯的方式把 URL 映射到其他地址。(適合解決一次性的重定向問題,例如,映射新近移動過的頁面)
- URL 路由。它執行同樣的任務,但更加精巧和靈活。(可以用作處理許多頁面的復雜重定向系統的基礎)
URL 映射
ASP.NET 映射的幕后的原理是把一個請求的 URL 映射到一個不同的 URL。映射規則保存在 web.config 文件中。它們在任何其他處理發生之前會首先被應用。
在 web.config 文件的 <urlMappings> 節中定義 URL 映射,需要提供 請求URL(url 特性) 和 目標URL(mappedUrl 特性)。
<system.web>
<urlMappings enabled="true">
<add url="~/Category.aspx" mappedUrl="~/Default.aspx?category=default"/>
<add url="~/Software.aspx" mappedUrl="~/Default.aspx?category=software"/>
</urlMappings>
</system.web>
使用 URL 映射,重定向的實現和 Server.Transfer()方法一樣,不會有服務器和客戶端之間的往返,瀏覽器的 URL 仍會顯示原是請求的 URL。對於代碼,Request.Path 和 Request.QueryString 反映的是新的 URL,Request.RawUrl 反悔被請求的原始的友好 RUL。
URL 路由
路由是 ASP.NET MVC 的核心功能,不過 ASP.NET 也允許在由 Web 表單組成的傳統 Web 應用程序里使用相同的路由技術。路由不是在 web.config 中設置的,而是通過代碼實現的。一般,會在 global.asax 文件的 Application_Start()里為應用程序注冊所有路由。
使用 System.Web.Routing 命名空間中的 RouteTable 類注冊路由。它有一個靜態屬性 Routes,這個屬性擁有為應用程序定義的一系列 Route 對象。起初,這個集合是空的,但是可以調用 MapPageRoute()方法創建自定義的路由,這個方法有 3 個參數:
- routeName:標識路由的名稱,可以是你希望的任意值。
- routeUrl:指定瀏覽器使用的 URL 格式。通常會由一個或多個變量信息組成,例如 /products/4312 這樣的 URL 請求某個產品頁面。
- physicalFile:它是目標的 Web 表單(使用路由時用戶被重定向的地址)。
下面這個示例在 Web 應用程序第一次啟動時添加兩個路由:
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapPageRoute("product-details", "product/{productID}", "~/productInfo.aspx");
RouteTable.Routes.MapPageRoute("product-in-category", "product/category/{categoryID}", "~/products.aspx");
// 路由 URL 可以有一個或多個參數,用花括號中的占位符表示
// 這里演示的第一個路由有一個名為 productID 的參數
// 這段信息將由 URL 取得並被傳送給目標頁面
}
這個 URL 使用該路由請求 ID 為 IF_00345 的產品:
接收到請求后,ASP.NET 路由架構把用戶重定向到 productInfo.aspx 頁面。所有參數通過 Page.RouteData 屬性提供,它最有用的屬性是 Values 集合,該集合按名稱索引提供原始請求的所有參數。
這里是目標頁的代碼片段:
public partial class ProductInfo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
object obj = Page.RouteData.Values["productID"];
if (obj != null)
{
lblInfo.Text = "You requested " + obj.ToString();
}
}
}
雖然可以硬編碼這種請求格式的 URL,不過也可使用 Page 類的輔助方法自動得到 URL 的格式,從而避免潛在的錯誤。下面的代碼檢查路由(通過注冊的名稱),並提供參數信息,最后得到返回的對應的 URL:
protected void Page_Load(object sender, EventArgs e)
{
HyperLink1.NavigateUrl = Page.GetRouteUrl("product-details", new { productID = "AAA168" });
}