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; }
總結
RouteTable.Routes.MapPageRoute(),首先會轉到呼叫靜態成員RouteCollection的多個同名的多載MapPageRoute(),接著在MapPageRoute()里再呼叫Add()方法,這樣就把一個名為Name的路由增加進了RouteCollection,轉載請註明出處,本文鏈接:https://www.uj5u.com/net/81.html
標籤:ASP.NET MVC
