Area 區域的作用
在生活中同樣也有區域的概念,如大型的酒店會將廚師根據不同的菜系開設專門獨立的檔口烹飪自己擅長的菜系。同理在MVC網站開發中我們也可以通過區域來獨立划分不同的模塊。如某些網站分前台(面向用戶)和后台(面向管理員),此情況就可以使用區域進行划分獨立。還例如可以將大型項目中包含訂單、CRM、權限,都可使用“Area 區域”進行獨立。
在使用了ASP.NET Area 區域后,每個區域中的目錄結構就相當於一個簡版的ASP.NET MVC目錄結構。
添加Area區域
在點擊“區域”菜單后會在項目的根目錄自動創建一個Areas文件夾,Areas文件夾下每個文件夾就是自定義名稱的區域文件夾,區域文件夾目錄結構就相當於一個簡版ASP.NET MVC的結構。
Areas區域結構如圖:
使用“Areas 區域”可利於開發的協同,每個開發者只用關注自己負責的區域模塊,在代碼提交到版本庫時可減少沖突。
另外,如果項目決定使用了“Areas 區域”來規划結構,那么根目錄的Controllers、Views、Models目錄可以根據實際情況進行忽略。
Areas區域的路由
我們知道請求一個ASP.NET MVC的頁面到服務器,服務器會根據RouteConfig中的路由規則和URL進行匹配解析,獲取到對應的Controller並執行Action。那么在項目中使用了“Areas區域”后,ASP.NET MVC是如何去解析對應的頁面請求規則呢?是會和站點根目錄的Controller共用RouteConfig里的路由規則嗎?下面就對以上的問題進行一個分析解讀。
Areas區域注冊文件
在創建“Areas 區域”后,區域的根目錄會自動創建一個以“區域名+AreaRegistration”命名的類,並且該類繼承之AreaRegistration類。類的結構參考圖如下:
RegisterArea方法
RegisterArea方法的作用就是將針對當前“Areas 區域”的路由規則進行一個注冊,最終注冊到項目的路由集合中。並且其中的name和url屬性都加入了區域名稱作為一個區分的標識。
路由注冊的順序
對於“Areas 區域”中的路由規則在ASP.NET MVC的注冊順序排列上是要優先於“網站級”的路由規則(RouteConfig文件),這個可以從“Global.asax”文件中的Application_Start方法中可以看出,“Areas 區域”的注冊代碼會在RouteConfig注冊的上層。
其中這個路由的注冊順序原則上是不能進行倒置的,因為如果“網站級”的路由規則的順序靠前的話,則路由匹配時會導致邏輯錯誤,例如原本的區域標識被作為Controller去匹配,原本的Controller則會作為Action匹配。
RouteDebugger工具
在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的路由規則解析,所有后續有匹配的它也不會去解析。
AreaRegistration.RegisterAllAreas()的注冊原理
RegisterAllAreas方法是專門為“Areas 區域”進行路由規則的注冊的,該方法會查找當前網站bin目錄下所有繼承了AreaRegistration類的子類,然后創建子類對象並調用每個子類中的RegisterArea方法,完成當前網站中所有路由規則注冊的工作。
區域路由注冊流程圖:
AreaName屬性
顧名思義“區域名稱”,其主要目的是告訴視圖引擎在哪個區域文件夾下找到相應的視圖文件,相當於一個標識的作用,用來區分項目中不同的區域。
Areas 區域中的Web.config
我們可以發現在“Areas 區域”的Views文件夾根目錄下都有一個獨立的Web.config文件。其中原因是:因為每個視圖在編譯過后會生成一個視圖類,並且這個類是派生自WebViewPage類,而“Areas 區域”中的這個Web.config文件就是告訴視圖引擎關於視圖類的繼承關系和一些列所依賴的配置信息,主要明確指出視圖類的基類。
注意:基於上述的依賴關系,所以我們不能刪除掉“Areas 區域”中的Web.config文件,刪除后會有如下的錯誤出現:
將Areas 區域中的控制器單獨分離到一個類庫中
示例操作如下:
- 新建類庫,並將控制器移植到類庫,並修改其命名空間,然后添加引用MVC命名空間。
2.在ASP.NET MVC項目中引用獨立的控制器類庫的程序集。
3.將ASP.NET MVC項目中的AreaRegistration文件移植到獨立的控制器類庫中,並修改其命名空間,然后添加引用System.Web命名空間。
最終演示結果: