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="https://www.cnblogs.com/green-jcx/archive/2020/09/28/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命名空間,

最終演示結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/134798.html
標籤:.NET技术
