天天看點

ASP.NET沒有魔法——ASP.NET MVC路由

  之前的文章中介紹了My Blog文章維護功能的開發,開發過程中使用Area的方法建立了用于維護文章的Controller、View和Model。但是無論代碼怎麼變對于浏覽器來說都是通過一個url位址去通路,現在My Blog可用的url有以下幾個:

  http://localhost:52356/ -- 首頁

  http://localhost:52356/Home --首頁

  http://localhost:52356/Post --部落格清單

  http://localhost:52356/Post/Get/1 --ID為1的部落格内容

  http://localhost:52356/Home/About --網站關于資訊

  http://localhost:52356/Admin/Home --管理首頁

  http://localhost:52356/Admin/PostManagement --管理部落格清單

  http://localhost:52356/Admin/PostManagement/Update/1 --更新ID為1的部落格内容

  http://localhost:52356/Admin/PostManagement/Insert --添加文章

  從上面清單可以發現可以通過兩個位址通路首頁,但是管理首頁隻有一個位址,可以像首頁一樣把Home省略掉嗎?出錯了?為什麼?而且為什麼文章添加、修改都需要Action名稱,但是清單頁的Index不需要?

  

ASP.NET沒有魔法——ASP.NET MVC路由

  根據URL來決定執行哪一個控制器的活動是ASP.NET MVC的路由機制決定的,本文将從以下幾點來介紹ASP.NET的路由機制:

  ●Web伺服器靜态資源的通路

  ●ASP.NET中的路由機制

  ●路由表

  ●路由的注冊

  ●路由注冊參數說明

  ●關于Area的路由

  當通路一個HTTP伺服器上的靜态檔案時,一般通過域名+檔案相對路徑來通路,如最開始的使用html編寫的文章清單頁面:

ASP.NET沒有魔法——ASP.NET MVC路由

  在ASP.NET 提供了路由(Routing)機制,它分析url來決定将請求轉到适當的位置,不再需要指定實體位置,但是ASP.NET的三種Web架構中路由機制也主要應用于MVC架構,其餘的Web Form和Web Page常用的仍舊是通過實體位址通路(注:ASP.NET中的三種Web架構均可使用路由)。

  ASP.NET中可以使用路由的原因是一個ASP.NET應用中有一個路由表(RouteTable),在My Blog項目中的App_Start目錄下的RouteConfig.cs檔案中的注冊路由(RegisterRoutes)方法的參數就是路由表,是一個System.Web.Routing.RouteCollection類型,以下是該類型的定義:

ASP.NET沒有魔法——ASP.NET MVC路由
ASP.NET沒有魔法——ASP.NET MVC路由

  注:在路由表的定義中有一個MapPageRoute的方法,該方法用于給Web Forms應用注冊路由,并且從參數可以看出通過指定一個routeUrl去比對一個實體檔案路徑。

  那MVC的路由注冊方法在什麼地方?MVC的路由僅僅是路由表的一個拓展,它位于System.Web.Mvc命名空間下:

ASP.NET沒有魔法——ASP.NET MVC路由

 

  再回到RouteConfig類中注冊路由的方法,這個方法它有這樣幾個作用:

ASP.NET沒有魔法——ASP.NET MVC路由

  1. 添加一個名稱為Default的路由條目。

  2. 路由用來比對{controller}/{action}/{id}這種模式的url。

  3. controller和action的預設值是Home和Index,id是可選的(這裡就解釋了為什麼http://localhost:52356/ 能夠通路到HomeController的Index Action),而且在通路清單頁面的Index Action的時候也不需要提供,因為預設已經被設定為Index。

  4. namespaces指定了隻比對命名空間在My_Blog.Controllers下的Controller(它解決了Home Controller重名的問題)。

  1. name:

  路由資訊的唯一辨別,當注冊兩條name一緻的路由會抛異常。

  2. url:

  它是一個url模闆,它的格式與url一樣,通過/分隔成多個段落,每一個段落可以由文字和變量占位符構成,其中變量占位符使用花括号{}擴住變量名稱,文字不能有特殊字元。在一個段落中可以定義多個變量,但是變量之間一定要用文字隔開,如/{controller}-{action}/是不正确的。在mvc中必要的變量有{controller}和{action},那麼{id}呢?每次建立預設MVC項目的路由注冊模闆中都有id這個變量它不是必要的嗎?

  做個實驗,把url模闆中的{action}變量删除:

ASP.NET沒有魔法——ASP.NET MVC路由

  運作程式後程式能夠運作,但是出現以下兩個問題:

  1). 使用Html.ActionLink建立的連結action參數失效,隻生成一個空連接配接:

ASP.NET沒有魔法——ASP.NET MVC路由
ASP.NET沒有魔法——ASP.NET MVC路由

  2). 除了index action的連接配接都無法打開了:

  http://localhost:52356/Home/About 會被識别為http://localhost:52356/Home/ 然後加上預設的index跳轉到首頁。

  而Post沒有被設定預設參數直接無法找到:

ASP.NET沒有魔法——ASP.NET MVC路由

  3). 當把預設action預設參數也删除時,啟動應用程式就直接抛異常了:

ASP.NET沒有魔法——ASP.NET MVC路由
ASP.NET沒有魔法——ASP.NET MVC路由

  注:但是删除{id}或者改變它的名稱都不會錯處,僅僅會影響action的參數綁定。

  3. defaults:

  路由的預設值,注意它不僅僅是路由模闆的變量預設值,路由模闆隻是包含在路由值這個集合中,這也就是上面實驗中把url目标的action變量删除後,它的預設值仍然有效的原有,關于路由值後面再詳細介紹。

  4. namespaces:

  一個命名空間數組,代表這個路由隻比對這些命名空間下的controller。避免多個子產品中存在同名Controller。是以如果一個應用程式存在多個子產品,那麼最好的方式就是針對每一個子產品的路由都加上自己子產品Controller的命名空間避免沖突。

  5. constraints:

  MapRoute方法中還有一個constraints參數,該參數是一個正規表達式集合,它用來驗證url中的參數是否符合表達式的要求。

  Area是MVC用來分隔功能的,通過VS來對一個MVC應用添加Area之後,會自動添加一個{Area名稱}AreaRegistration.cs的檔案,該檔案包含了對這個Area的路由注冊,它的url模闆根據area的名稱進行了寫死:

ASP.NET沒有魔法——ASP.NET MVC路由

  該路由隻比對由Admin開頭的url。

  如果存在重名可能,那麼最好添加該Area的Controller的命名空間。

如何在ASP.NET MVC中使用路由 

  上面介紹了注冊路由的方法和它的參數,并且根據示例代碼可以看出,在MVC中注冊路由隻需要提供url模闆和變量的預設值即可,如果應用中可能會存在同名Controller那麼隻需要再加入命名空間就好,這裡就簡單總結一下:

  ● ASP.NET MVC路由的url模闆必須設定{controller}和{action}變量。

  ● 路由中可以通過defaults參數對路由值(包括模闆變量)設定預設值。

  ● 如果存在命名沖突可以通過namespaces數組解決。

  ● 如果使用area來分隔功能,那麼注意其自動生成的url模闆,如果可能存在命名沖突,可以使用namespaces屬性解決。

  ● 路由表是有序的,當比對到一個路由後,後續的路由将不會被比對,是以要注意順序,以免被路由到錯誤的處理器(注:關于處理器後續文章介紹)。

  本章簡單介紹了ASP.NET的路由機制,以及在MVC程式中用于注冊路由的方法和參數,并總結了路由的一些使用方法,在後續文章中将對路由的工作機制進一步介紹。

參考:

  https://msdn.microsoft.com/en-us/library/cc668201.aspx#setting_default_values_for_url_parameters

本文連接配接:http://www.cnblogs.com/selimsong/p/7660176.html 

ASP.NET沒有魔法——目錄

作者:7m魚

出處:http://www.cnblogs.com/selimsong/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

ASP.NET沒有魔法——ASP.NET MVC路由

繼續閱讀