[ASP.NET MVC] Study Notes(2)–Routing (1)

  • 1927
  • 0

[ASP.NET MVC] Study Notes(2)–Routing (1)

在前一篇中預設範本的例子裡,筆者有提到在網址中輸入 localhost:25736 及 localhost:25736/home/index 所看到的結果都是一樣的,而背後端的運作靠的就是 Routing 機制,把url請求轉化為對應至某一個Controller的某一個Action。在ASP.NET MVC裡Routing 機制是有RoutingTable.Routes object把所有的路由規則所儲存起來的,我們來看看範本專案是如何定義Routing。

 

在App_Start目錄裡有個RouteConfig.cs,這個檔案就是ASP.NET MVC 4.0裡用來定義路由規則的,而預設中己經有定義了一組預設的路由規則。

image

 

打開RouteConfig.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 }
            );
        }
    }

routes.IgnoreRoute :忽略要比對的網址請求,也就是說符合這個樣式的網址請求會像是一般普通的網址一樣,在這個設定上可以看到有二個變數,分別是resource及pathInfo,而這個設定樣式代表的意思是,以.axd結尾且不管後續串接幾層的url路徑都不用理會,也就是視為一般的url網址請求,例如以下的幾個例子

(1)http://localhost/a.axd/mypage

(2)http://localhost/a.axd/mypage/hello

(3)http://localhost/a.axd/mypage/hello/aspnetmvc

要注意的是在pathInfo變數前有個 * 字符號,這表示當比對到.axd後會完整抓取後續的url,若是沒有特別加上 * 字符號,則上例(2)(3)的url就不會比對成功,因為此時的設定表示只取到.axd後一層的url,也就是(1)的樣式。

 

routes.MapRoute:定義要比對的url樣式,設定上以參數方式進行,name為Route的名稱,必須是唯一的,url為url Routing樣式,其中除了{controller}、{action}之外其餘部份可以依需求自行定義,而defaults則是當傳入的url比對不到的時候就會以此設定值代替,其中id=UrlParameter.Optional表示id是一個選項參數,即使網址中沒有id也是可以符合的。

 

在初步了解ASP.NET MVC 4.0的預設Routing 設定後,再回過頭來看localhost:25736 及 localhost:25736/home/index 的請求,當我們輸入localhost:25736 時因比對不到符合的樣式,於是就採取了defaults的設定,因此導向了controller = home / action=index,而當我們輸入localhost:25736/home/index 時,則因為符合{controller}/{action}的樣式定義,因此也就導向了controller = home / action=index,所以也就變成了不管是輸入localhost:25736 的請求或是localhost:25736/home/index 的請求,其最後的結果都是一樣的囉。

 

image

 

學習之旅待續…………

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18