1. 程式人生 > >ASP.NET MVC-輕鬆理解Routing(路由)

ASP.NET MVC-輕鬆理解Routing(路由)

先來看下面兩個個url,對比一下:

  1. http://xxx.yyy.com/Admin/UserManager.aspx
  2. http://xxx.yyy.com/Admin/DeleteUser/1001 

   對於第1個Url,假設它與伺服器上的檔案有直接的關係,那麼伺服器在接受客戶端請求並將對應的檔案傳送給客戶端。我們大概可以猜到它是對使用者管理的一個頁面,它的物理檔案UserManager.aspx在網站根目錄下面的Admin資料夾中。而第2個url,在不知道Mvc路由以及Url重寫時,很難猜到這個Url背後具體有些什麼,前提條件是基於.Net框架開發的Web專案。 那麼在這裡,我們引入Asp.Net Mvc Url路由這個概念,也正是本文所要闡述的主題,Url路由模組是負責對映從瀏覽器請求到特定的控制器動作。

  基於上面提到的Url路由以及其作用,我們就大概能猜到第2個Url背後有些啥了。 自然而然的Admin就是控制器了,DeleteUser是控制器裡面的動作及Action了,1001就是Action的引數。到這裡我們對Url路由有一個簡單的認識,那麼接著看下面一組url,假設Home是控制器,Index是控制器裡面的Action,至於1001或者2345這類資料我們暫且約定為引數:

  1. http://xxx.yyy.com
  2. http://xxx.yyy.com/Home/1001
  3. http://xxx.yyy.com/Index/1001
  4. http://xxx.yyy.com/Home/Index/1001/2345
  5. http://xxx.yyy.com/System/Home/Index/1001

按照約定,從上面的幾組Url中可以看出,有的缺控制器,有的缺Action,有的帶有好幾個引數,有的又莫名的多出了控制器、Action、引數之外的東西,那麼他們能正確的訪問嗎?

  註冊路由

    在vs2012裡面新建一個asp.net mvc4 web 應用程式專案,可以在專案的根目錄下App_Start裡面看到RouteConfig檔案,在這個檔案裡面就可以新增url路由了。在檔案裡面可以看到MapRoute 這個方法,它是RouteCollection的擴充套件方法,並且含有多個過載,下面看看MapRoute方法的引數,這裡選引數最多的那個:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);

從上面的程式碼片段大概可以看出該方法含有路由名稱、路由的Url、預設值、約束、首先查詢路由所在的名稱空間,該方法是返回對對映路由的引用。不過在RouteConfig檔案中我們可以看到新增路由的程式碼:

routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

稍微分析一下這段程式碼可以知道,在路由集合裡面添加了一個名為"Default"的路由,並且有一個預設的路由指向,指向名稱為Home的控制器,並且Action為Index,可以明顯的看到這裡 "id = UrlParameter.Optional" 的寫法,它的意思就是說Action的引數可以不需要使用者來指定,可以預設。

引言
  聽到路由兩字,想必首先想到的會是計算機網路中的路由,通過分組轉發來將不同的資料包傳送到對應的目的地址。其核心是路由表,表中記錄瞭如何到達各目的地。

  ASP.NET MVC(下文都用MVC來特指ASP.NET MVC)中的Routing同樣的也是完成這件事。使用者提交請求後,系統根據路由表將請求送至相應的Controller中,然後為使用者請求做出響應。

概念
  在Web應用中,我們都會通過URL(俗稱網址)來發送我們對頁面的請求,開啟瀏覽器,輸入我們將要訪問網站的網址,然後等待瀏覽器載入我們期待的頁面。

傳統的Web Form開發,URL對映到的是一個具體的處理程式,磁碟上的物理檔案,如一個aspx檔案。

MVC中多數情況下是將URL對映到Controller和Controller下的Action。

  一個倉庫,傳統的方式是使用者直接擁有貨物的地址,知道貨物的具體位置,哪一個貨架,哪一行,哪一列。而MVC則是使用者需要告訴前臺的倉庫保管員,由倉庫保管員找到使用者需要的貨物並交給使用者。
--------------------- 
 

過程

  在學習路由時,我覺得我們應該清楚MVC是如何處理請求並響應的。控制器中類的每個公共方法被稱為Action方法。ASP.NET路由系統內部根據請求的URL和路由配置呼叫對應的Action方法,完成處理操作後,再選擇一個檢視呈現給客戶端.

路由表

Default

  當新建一個新的MVC應用程式(以MVC3為例),會預設配置ASP.NET路由。在Global.asax檔案中建立了一個Default路由表。

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // 路由名稱
                "{controller}/{action}/{id}", // 帶有引數的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 引數預設值
            );

        }
 

 一個MVC應用程式首次執行時,會呼叫Application_Start()方法。這個方法隨後呼叫了RegisterRoutes()方法。RegisterRoutes()方法建立了路由表。

  預設路由對映:

第一部分——Controller

第二部分——Controller下的Action

第三部分——名為id的引數

  所謂預設路由,表明如果不填寫Controller,會預設定位HomeController,如果不填寫Action,會預設呼叫Index方法,如果不填寫id,那麼預設為空字串。

  即以下這些URL都會定位到HomeController.Index()方法,返回Index View檢視。

http://localhost:38226/

http://localhost:38226/Home

http://localhost:38226/Home/Index
 

Custom

  對於多數簡單的MVC應用程式來講,預設的路由表已經足夠用了,不過如果有特殊的路由需求,還可以建立自定義的路由表。

  需要注意的是,我們應當把自定義的路由新增到預設路由前面,注意路由順序。

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Blog",                                           // 路由名稱,自定義的路由
                "Archive/{entryDate}",                            // 帶有引數的 URL
                new { controller = "Archive", action = "Entry" }  // 引數預設值
            );
            routes.MapRoute(
                "Default",                                              // 路由名稱
                "{controller}/{action}/{id}",                           // 帶有引數的 URL
                new { controller = "Home", action = "Index", id = "" }  // 引數預設值
            );
        }
 

小結

  Routing不是隻有MVC應用程式才會有,ASP.NET 4.0後,ASP.NET MVC的路由規則全部可以用於WebForms。