WebForm中路由的淵源 大多數做過.NET WEB FORM的人,第一次接觸ASP.NET MVC, 對路由可能很陌生,在他們的潛意識裡訪問一個.Net Web 應用程式是這樣的。 從訪問地址我們能看出,對應的是一個物理地址Index.aspx文件,是一對一的物理關係。假如我們在後期更改文件名稱 ...
WebForm中路由的淵源
大多數做過.NET WEB FORM的人,第一次接觸ASP.NET MVC, 對路由可能很陌生,在他們的潛意識裡訪問一個.Net Web 應用程式是這樣的。
從訪問地址我們能看出,對應的是一個物理地址Index.aspx文件,是一對一的物理關係。假如我們在後期更改文件名稱或移動文件位置後,頁面地址也會發生改變,用URL地址再訪問時頁面會失效,且報404頁面不存在的錯誤。
其實路由並不是ASP.NET MVC特有的,其實在WEB.FORM開發裡面就有了。只是我們沒有去深究它。然而隨著時間的推移,我們的URL不再是一個.aspx頁面了,而是像{xxxx}/{xxx}的URL形式來對應一個aspx文件。
因此,我們可以知道路由可以解決URL與物理文件分離,它維繫著URL與物理文件之間的關聯映射,使URL和物理文件的改變,都不會受影響。
WEB FORM如何使用路由?
1. 新建一個ASP.NET WEB應用程式,然後選擇空項目模板。並新建一個Dafault.aspx、Global.asax文件。
2. 打開Global文件,在Application_Start方法中添加路由信息。
1) “List'”路由名稱,可以理解為這個路由的名稱是List,也就是路由的標識符。
2) “Blog/{Name}/{Category}”表示以一個什麼樣的URL格式訪問default.aspx頁面,其中{Name}和{Category}表示路由變數。
3) “Default.aspx”:要訪問的實際頁面,也就是訪問URL實際要映射的物理文件。
4) “ new RouteValueDictionary() { { "Name", "*" }, { "Category", "*" } }:表示路由變數預設值。當我們在URL中沒有指定Name和Category,那麼將採用預設值*.
5) “ new RouteValueDictionary() { { "ID", "*" } }:路由的Token值,可以理解為一個附加的路由值。
3. 我們在路由集合中添加了一個名為“List”,訪問格式為“Blog/{Name}/{Category}”的URL,實際訪問頁面為Default.aspx,預設路由變數Name="*",Category="*"的路由。當我們在瀏覽器中輸入http://lcoalhost/Blog
源碼分析
RouteTable.Routes.MapPageRoute背後到底發生了什麼呢?下麵我們來分析源碼:
註:使用ILSpy工具進行源碼解析:下載地址
RouteTable.cs
using System; using System.Runtime.CompilerServices; namespace System.Web.Routing { [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] public class RouteTable { private static RouteCollection _instance = new RouteCollection(); //單列模式 public static RouteCollection Routes //屬性,返回RouteCollection對象集合 { get { return RouteTable._instance; } } } }
RouteCollection.cs類中的MapPageRoute方法
public Route MapPageRoute(string routeName, string routeUrl, string physicalFile, bool checkPhysicalUrlAccess, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens) { if (routeUrl == null) //路由格式不能為空,否則會報routeRul異常。上面例子中指的是 "Blog/{Name}/{Category}" { throw new ArgumentNullException("routeUrl"); }
// 實例一個路由對象,根據設置的路由信息,添加到路由集合RouteCollection中 Route route = new Route(routeUrl, defaults, constraints, dataTokens, new PageRouteHandler(physicalFile, checkPhysicalUrlAccess)); this.Add(routeName, route); return route; }