服務(wù)熱線
153 8323 9821
本篇文章從基礎(chǔ)到深入的介紹ASP.NET MVC中的Routing組件. Routing翻譯過來是"路由選擇", 負責(zé)ASP.NET MVC的第一個工作:識別URL, 將一個Url請求"路由"給Controller.
第一篇文章中我們已經(jīng)學(xué)會了如何使用ASP.NET MVC, 雖然其中還有很多的細節(jié)沒有深入了解, 但是對基本的處理流程已經(jīng)有了認識:來了一個Url請求, 從中找到Controller和Action的值, 將請求傳遞給Controller處理. Controller獲取Model數(shù)據(jù)對象, 并且將Model傳遞給View, 最后View負責(zé)呈現(xiàn)頁面.
而Routing的作用就是負責(zé)分析Url, 從Url中識別參數(shù), 如圖:
這一講就讓我們細致的了解System.Web.Routing及其相關(guān)的擴展知識.
第一講中實例的首頁地址是: localhost/home/index
我們發(fā)現(xiàn)訪問上面的地址, 最后會傳遞給 HomeController中名為index的action(即HomeController類中的index方法).
當然服務(wù)器端不會自己去實現(xiàn)這個功能, 關(guān)鍵點就是在Global.asax.cs文件中的下列代碼:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
回來看我們的Url: localhost/home/index
localhost是域名, 所以首先要去掉域名部分: home/index
對應(yīng)了上面代碼中的這種URL結(jié)構(gòu): {controller}/{action}/{id}
因為我們建立了這種Url結(jié)構(gòu)的識別規(guī)則, 所以能夠識別出 Controller是home, action是index, id沒有則為默認值"".
這就是Routing的第一個作用:
1.從Url中識別出數(shù)據(jù).比如controller,action和各種參數(shù).
如果跟蹤程序, 接下來我們會跳轉(zhuǎn)到HomeController中的Index()方法. 這是Routing內(nèi)部為實現(xiàn)的第二個作用:
2.根據(jù)識別出來的數(shù)據(jù), 將請求傳遞給Controller和Action.
但從實例中我們并不知道Routing如何做的這部份工作.第五部分我做了深入講解.
在分析Routing的實現(xiàn)原理前, 先學(xué)習(xí)如何使用Routing為ASP.NET MVC程序添加路由規(guī)則.
這是最簡單的為ASP.NET MVC添加識別規(guī)則的方法.此方法有如下重載:
MapRoute( string name, string url); MapRoute( string name, string url, object defaults); MapRoute( string name, string url, string[] namespaces); MapRoute( string name, string url, object defaults, object constraints); MapRoute( string name, string url, object defaults, string[] namespaces); MapRoute( string name, string url, object defaults, object constraints, string[] namespaces);
規(guī)則名稱, 可以隨意起名.當時不可以重名,否則會發(fā)生錯誤:
路由集合中已經(jīng)存在名為“Default”的路由。路由名必須是唯一的。
url獲取數(shù)據(jù)的規(guī)則, 這里不是正則表達式, 將要識別的參數(shù)括起來即可, 比如: {controller}/{action}
最少只需要傳遞name和url參數(shù)就可以建立一條Routing(路由)規(guī)則.比如實例中的規(guī)則完全可以改為:
routes.MapRoute(
"Default",
"{controller}/{action}");
url參數(shù)的默認值.如果一個url只有controller: localhost/home/
而且我們只建立了一條url獲取數(shù)據(jù)規(guī)則: {controller}/{action}
那么這時就會為action參數(shù)設(shè)置defaults參數(shù)中規(guī)定的默認值. defaults參數(shù)是Object類型,所以可以傳遞一個匿名類型來初始化默認值:
new { controller = "Home", action = "Index" }