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

    1. name: 路由的名稱

    2. url: {Controller}/{action}/{id}將網址列對應到Controller、action、id的規則

    3. defaults: 如果不輸入完整網址對應到的預設值,這裡對應到的是HomeController中的Index動作

Routing範例

網址:https://localhost:44378/

比對過程:

  1. 比對IgnoreRoute => 比對失敗

  2. 比對MapRoute => 網址列沒有滿足{Controller}/{action}/{id}的規則

  3. 對應到defaults => 實際顯示畫面等同於https://localhost:44378/home/index

網址:https://localhost:44378/Trace.axd

比對過程:

  1. 比對IgnoreRoute => 比對成功,交由其他HTTP模組處理,不進入MapRoute比對

網址:https://localhost:44378/Message/Create

比對過程:

  1. 比對IgnoreRoute => 比對失敗

  2. 比對MapRoute => 比對成功

  3. 根據網址解析出對應的Controller與action => Controller: MessageController, Action: Create

網址:https://localhost:44378/Message/ShowMessage/15

比對過程:

  1. 比對IgnoreRoute => 比對失敗

  2. 比對MapRoute => 比對成功

  3. 根據網址解析出對應的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# )