前幾篇有大概簡單的講到路由,此篇將會進一步解說詳細內容
先來看看路由的設定檔內容:App_Start\RouteConfig.cs
1.RegisterRoute(RouteCollection routes)
這是執行Web的入口點,會接收從Global.asax傳來的RouteTable.Routes的靜態方法
2.IgnoreRoute()
用來定義不要透過網址路由處理的網址,將不會進入MVC的執行生命週期,將由IIS的其他HTTP模組處理
3.{resource}.axd
resource代表一個RouteValue的路由變數名稱,可以取任何名字替代,就只是代表一個位置而已
{resource}.axd代表意思是所有*.axd的網址都不透過MVC來執行,例如Web Form就是常見的.axd,所以必須排除
4.{*pathInfo}
也是一個路由變數名稱,定義的意思是只要網址有.axd,後面出現的任何路經都直接跳過
5.MapRoute
用來定義網址路由擴充方法
6.name
定義Route名稱,預設是Default
7.url
定義url樣式與路徑段落的參數名稱,例如/Home/Index/1111
8.defaults
當網址路由比對不到網址會進入到這裡嘗試比對是否有符合的Controller與Action可以執行
URL與路由的比對
1.比對的順序是由上而下逐一比對
ex:http://127.0.0.1/abc.axd
此URL在IgnoreRoute比對成功,將不會丟給MVC執行,會重新返回給IIS的其他HTTP模組
ex:http://127.0.0.1/Home/details?id=0001
此URL在IgnoreRoute沒有比對成功所以會進入到MapRoute(),Controller/Action/都比對成功但因?id=0001是QueryString不屬於路由範圍,所以路由會比對default的設定,也就是UrlParameter.Optional,所以最終會比對成功進入MVC執行週期
2.MapRoute的條件約束
在MapRoute可以加上第四個參數constraints來限制路由條件
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new {id=@"\d+"}//id參數只接受數字
);