MVC文章-『Routing網址路由流程』
MVC基本的路由流程如上圖,首先瀏覽器會向伺服器發出Request,這時會先由IIS接受到這個封包,
然後再轉給Route路由負責決定要將此要求交由那個HttpHandler來處理。如果是MVCHandler來處理,
這時就會進入ASP.NET MVC的執行生命週期。
我們此處從程式碼來說明瀏覽器向伺服器發出Request後程式會著麼跑。
Step1.
發出Request,localhost:32522
Step2.(第一次執行時)
執行Gloabal.aspx中的RouteConfig.RegisterRoutes來定義Route比對規則,並將Route規則加入至
RouteTable中。
RouteTable.Routes是為公開的靜態物件,用來儲存所有的Routing規則,其物件型別為RouteCollection。
其中RouteConfig.RegisterRoutes在App_Start下面。
執行RegisterRoutes前,RouteTables還是空的。
執行後可以看到RegisterRoutes增加了兩條規則。
Step3.
Route Handler會自動將請求的網址拿來與RoutesTable進行比對。
我們先來看看預設的Route規則第一行。
IgnoreRoute :
這個方法用途是『忽略』比對到的網址,忽略的意思是不進入MvcHandler 會當成一般的ASP.NET網頁來執行。
resource 、pathInfo :
你可以想成一個用來替代的符號(沒有意義)。
*pathInfo :
加*號網址是指, test.asd/detail/sports/3 ,如果沒加*號,則只會比對到『detail』,如果有加*號,是代表全部。
我們在MapRoute方法中多加一行contraints,主要是用來限制某些條件,才能比對該項規則。
MapRoute :
MapRoute的方法則是拿來定義URL Routing的擴充方法
Name :
Route的名稱,此名稱必須是唯一的。
url :
定義URL Routing 的樣式,其中被{}包住的變數除了controller和action,後面的都可以依據自已的需要自定義。
defaults :
當傳入的網址比對不到的時候,就會依據default定義的值替代,在這裡要特別提到其中id的設定。
UrlParamreter.Optional:
這個意思為即使網址中沒有id也會預設通過。
constraints :
代表只有About或contact事件(範例) 才會比對。
其中constraints也可以運用Regular Expression來進行限制。
例如constraints: @”\d+”就代表{id}路由值的內容必須全為數字才算成功比對。
注意:
URL Routing 是由上而下比對
Ex.http://localhost:32522/contact/1
比對順序
1.比對routes.IgnoreRoute格式{resource}.axd/{*pathInfo}
比對要求的URL第一部份為contact,沒有比對到.axd,比對失敗。
2.比對routes.MapRoute的{action}/{id}格式。
比對要求的URL第一部份contact,並且比對到{action}同時也符合限制條件。
比對要求的URL第二部份1,並且比對到{id}。
比對結果
該網址以routes.MapRoute擴充方法進行比對成功,因此Routing模組將會把此次的請求,
委託給MmvcHandler負責處理。
參考資料
http://www.dotblogs.com.tw/lastsecret/archive/2010/02/27/13798.aspx
書籍
ASP.NET MVC4開發實戰(保哥)
ASP.NET MVC4網站開發美學