06 Routing簡介 - wycmaker/MVC-learning GitHub Wiki
介紹
與以往ASP.NET Web Form的網址是對應到實體檔案的位置不同,ASP.NET MVC是透過Routing(網址路由)來比對HTTP請求傳回的網址,進而轉向對應的Controller與Action,Routing的定義是放在/APP_Start/RoutingConfig.cs
中。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
-
IgnoreRoute: 定義
*.axd
格式的網址將不會由ASP.NET MVC 的Routing來處理,在網址比對時,若在IgnoreRoute這條規則比對成功,則不會進行MapRoute的比對。 -
MapRoute: 定義了三個參數,分別為name、url、defaults
-
name: 路由的名稱
-
url:
{Controller}/{action}/{id}
將網址列對應到Controller、action、id的規則 -
defaults: 如果不輸入完整網址對應到的預設值,這裡對應到的是HomeController中的Index動作
-
Routing範例
網址:https://localhost:44378/
比對過程:
-
比對IgnoreRoute => 比對失敗
-
比對MapRoute => 網址列沒有滿足
{Controller}/{action}/{id}
的規則 -
對應到defaults => 實際顯示畫面等同於
https://localhost:44378/home/index
網址:https://localhost:44378/Trace.axd
比對過程:
- 比對IgnoreRoute => 比對成功,交由其他HTTP模組處理,不進入MapRoute比對
網址:https://localhost:44378/Message/Create
比對過程:
-
比對IgnoreRoute => 比對失敗
-
比對MapRoute => 比對成功
-
根據網址解析出對應的Controller與action => Controller: MessageController, Action: Create
網址:https://localhost:44378/Message/ShowMessage/15
比對過程:
-
比對IgnoreRoute => 比對失敗
-
比對MapRoute => 比對成功
-
根據網址解析出對應的Controller、action、id => Controller: MessageController, Action: ShowMessage, id: 15
Routing條件約束
除了MapRoute中原本就有的三個參數,我們可以加入第四個參數constrains來進行路由的條件約束
例如:在MapRoute中加入constrains:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { action = @"\d+"}
);
代表路由的action必須全部是數字才行,假如action不是全為數字,代表沒有通過條件約束,所以就算前面的條件比對成功,這次的比對依舊是失敗的。
參考資料
書籍:ASP.NET MVC 4 開發實戰
書籍:一次就懂 ASP.NET MVC 5.x 網站開發:Web應用的經典實務範例解析(Visual C# )