在生活中一樣也有區域的概念,如大型的酒店會將廚師根據不一樣的菜系開設專門獨立的檔口烹飪本身擅長的菜系。同理在MVC網站開發中咱們也能夠經過區域來獨立劃分不一樣的模塊。如某些網站分前臺(面向用戶)和後臺(面向管理員),此狀況就能夠使用區域進行劃分獨立。還例如能夠將大型項目中包含訂單、CRM、權限,均可使用「Area 區域」進行獨立。服務器
在使用了ASP.NET Area 區域後,每一個區域中的目錄結構就至關於一個簡版的ASP.NET MVC目錄結構。工具
在點擊「區域」菜單後會在項目的根目錄自動建立一個Areas文件夾,Areas文件夾下每一個文件夾就是自定義名稱的區域文件夾,區域文件夾目錄結構就至關於一個簡版ASP.NET MVC的結構。網站
Areas區域結構如圖:url
使用「Areas 區域」可利於開發的協同,每一個開發者只用關注本身負責的區域模塊,在代碼提交到版本庫時可減小衝突。spa
另外,若是項目決定使用了「Areas 區域」來規劃結構,那麼根目錄的Controllers、Views、Models目錄能夠根據實際狀況進行忽略。3d
咱們知道請求一個ASP.NET MVC的頁面到服務器,服務器會根據RouteConfig中的路由規則和URL進行匹配解析,獲取到對應的Controller並執行Action。那麼在項目中使用了「Areas區域」後,ASP.NET MVC是如何去解析對應的頁面請求規則呢?是會和站點根目錄的Controller共用RouteConfig裏的路由規則嗎?下面就對以上的問題進行一個分析解讀。調試
在建立「Areas 區域」後,區域的根目錄會自動建立一個以「區域名+AreaRegistration」命名的類,而且該類繼承之AreaRegistration類。類的結構參考圖以下:對象
RegisterArea方法的做用就是將針對當前「Areas 區域」的路由規則進行一個註冊,最終註冊到項目的路由集合中。而且其中的name和url屬性都加入了區域名稱做爲一個區分的標識。blog
對於「Areas 區域」中的路由規則在ASP.NET MVC的註冊順序排列上是要優先於「網站級」的路由規則(RouteConfig文件),這個能夠從「Global.asax」文件中的Application_Start方法中能夠看出,「Areas 區域」的註冊代碼會在RouteConfig註冊的上層。繼承
其中這個路由的註冊順序原則上是不能進行倒置的,由於若是「網站級」的路由規則的順序靠前的話,則路由匹配時會致使邏輯錯誤,例如本來的區域標識被做爲Controller去匹配,本來的Controller則會做爲Action匹配。
在ASP.NET MVC中有一種能夠進行路由規則分析的工具就是RouteDebugger。
使用方式:
1.在MVC項目中引用RouteDebugger.dll文件。
2.在Web.config中新增節點 <add key="RouteDebugger:Enabled" value="true" />
程序集下載
連接:https://pan.baidu.com/s/13bRI5YLPRZtNr6IAsrOTTg
提取碼:ppdo
使用路由規則調試器(RouteDebugger)來看看正常順序下路由匹配的結果:
從圖中能夠看出「Areas 區域」匹配是在最前列的,而且成功的解析到區域信息。
使用路由規則調試器(RouteDebugger)來看看顛倒順序(RouteConfig註冊放在區域路由的前面)後的路由匹配結果:
結果:
錯誤緣由分析:因爲顛倒了「Areas 區域」和「RouteConfig」的註冊順序,從而致使Areas 區域的請求URL去匹配「網站級別」的路由,出現了錯誤的邏輯解析。可能有人會有疑問,圖中匹配了多個True的路由規則,爲何會執行失敗?這是由於在路由匹配時若是發現URL和路由集合中某條是能夠匹配的,則會中斷後續的路由規則匹配,也就是說只會執行第一條True的路由規則解析,全部後續有匹配的它也不會去解析。
RegisterAllAreas方法是專門爲「Areas 區域」進行路由規則的註冊的,該方法會查找當前網站bin目錄下全部繼承了AreaRegistration類的子類,而後建立子類對象並調用每一個子類中的RegisterArea方法,完成當前網站中全部路由規則註冊的工做。
區域路由註冊流程圖:
顧名思義「區域名稱」,其主要目的是告訴視圖引擎在哪一個區域文件夾下找到相應的視圖文件,至關於一個標識的做用,用來區分項目中不一樣的區域。
咱們能夠發如今「Areas 區域」的Views文件夾根目錄下都有一個獨立的Web.config文件。其中緣由是:由於每一個視圖在編譯事後會生成一個視圖類,而且這個類是派生自WebViewPage類,而「Areas 區域」中的這個Web.config文件就是告訴視圖引擎關於視圖類的繼承關係和一些列所依賴的配置信息,主要明確指出視圖類的基類。
注意:基於上述的依賴關係,因此咱們不能刪除掉「Areas 區域」中的Web.config文件,刪除後會有以下的錯誤出現:
示例操做以下:
2.在ASP.NET MVC項目中引用獨立的控制器類庫的程序集。
3.將ASP.NET MVC項目中的AreaRegistration文件移植到獨立的控制器類庫中,並修改其命名空間,而後添加引用System.Web命名空間。
最終演示結果: