ASP.NET MVC-輕鬆理解Routing(路由)
先來看下面兩個個url,對比一下:
- http://xxx.yyy.com/Admin/UserManager.aspx
- 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這類資料我們暫且約定為引數:
- http://xxx.yyy.com
- http://xxx.yyy.com/Home/1001
- http://xxx.yyy.com/Index/1001
- http://xxx.yyy.com/Home/Index/1001/2345
- 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。