ASP.NET MVC中Area分層模組處理大解密
ASP.NET MVC中,是依靠某些資料夾以及類的固定命名規則去組織model實體層,views檢視層和控制層的。如果是大規模的應用程式,經常會由不同功能的模組組成,而每個功能模組都由MVC中的三層所構成,因此,隨著應用程式規模的增大,如何組織這些不同功能模組中的MVC三層的目錄結構,有時對開發者來說顯得是種負擔。
幸運的是,ASP.NET MVC允許開發者將應用劃分為“區域”(Area)的概念,每個區域都是按照asp.net mvc的規定對檔案目錄結構和類的命名規則進行命名。在本文中,將介紹如何在ASP.NET MVC應用中使用Area進行模組管理。
什麼是Areas?
簡單來說,Areas是將ASP.NET MVC應用按照不同的功能模組劃分,對每個功能模組使用ASP.NET MVC規則的目錄結構和命名方法。考慮如下圖的場景:
在上圖中可以看到,這個應用程式由三個功能模組組成,分別為Blog,Help Desk和Shopping。如果不使用區域Areas的話,則必須將所有的控制層和檢視層檔案都放在各自的目錄中去,顯然,不能在不同的功能模組中的對控制器有相同的命名,比如不能在Blog模組中命名HomeController,同時也對HelpDesk模組命名HomeController。可以解決的方法是,在一個控制器中將所有的模組中的action方法都放在一起,或者建立兩個控制器,以不同的方法命名(BlogHomeController和HelpDeskHomeController).
如果使用了areas進行模組劃分,則每個功能模組都會複製MVC的目錄結構。比如,每個模組都會有自己的控制層,檢視層和實體層的目錄。因此,可以在Blog模組中擁有HomeController類,在HelpDesk模組中也可以同名的HomeController類。所以,實際上在上面的例子中,將會有4個MVC的結構,一個是主程式的,三個分別是三個模組(Blog, HelpDesk and Shopping的)
增加新的Area
下面我們來開始學習如何新增Area。首先使用vs.net 2010新建一個MVC應用。然後在方案解決器中,滑鼠右鍵點選後在出現的選單中選擇新增>Area,就會顯示如下圖的對話方塊:
在其中輸入要增加的Area的名稱,比如HelpDesk。在輸入三個不同的Area後,專案呈現如下圖的結構:
可以看清晰看到,整個應用是有一個叫Areas的目錄,其中下面三個模組都有各自的控制層,模型層和檢視層的目錄了。同樣,在應用的外層目錄中,依然有實體層和控制層和檢視層的目錄。
在MVC框架中註冊Area
除了建立好目錄結構外,還需要告訴ASP.NET MVC框架area已經建立好了,這個屬於註冊的步驟,幸運地在建立一個新的area時已經自動建立起來了。請注意在每一個area的目錄下,都會自動產生一個註冊的類檔案(比如BlogAreaRegistration.cs, HelpDeskAreaRegistration.cs,)。每一個area的註冊類檔案都是繼承自AreaRegistration這個基類,比如HelpDeskAreaRegistration的類檔案程式碼如下:
public class HelpDeskAreaRegistration : AreaRegistration
public override string AreaName
get
return HelpDesk;
public override void RegisterArea(AreaRegistrationContext context)
context.MapRoute(
HelpDesk_default,
HelpDesk/{controller}/{action}/{id},
new { action = Index, }
);
可以看到,HelpDeskAreaRegistration類覆寫了AreaName屬性和RegisterArea方法。RegisterArea方法則在MVC中註冊了新的路由資訊。
在每一個area中都必須有一個象這樣的註冊類。但什麼時候去使用這些註冊的類呢?如果開啟Global.asx這個檔案,會發現在Application_Start事件中會發現如下程式碼:
protected void Application_Start()
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
這裡讀者可以看到,呼叫了AreaRegistration類的靜態方法RegisterAllAreas()去註冊所有的are註冊檔案,而RegisterAllAreas()方法會去逐一呼叫應用中所有area的RegisterArea()方法。
接下來,在主程式及每個area中都增加HomeController,這樣,就會有四個以HomeController命名的控制類,如下所示:
public class HomeController : Controller
public ActionResult Index()
return View();
同樣,滑鼠右擊每個Index()方法,在彈出的選單中新增加一個Index檢視,這樣總共有4個index檢視頁面。執行應用,可以看到如下圖的效果,下圖是其中執行HelpDesk Area時的效果,請留意其中的URL
Areas之間的呼叫
ASP.NET MVC中,經常需要在控制層的不同方法之間進行互相呼叫。如果沒特別指定,則預設為同一個area中的action方法和控制器之間的呼叫。如果需要在不同的area之間進行互相呼叫,可以使用如下方法:
%= Html.ActionLink(Main Area, Index, Home, new { area = }, null)%>
br />br />
%= Html.ActionLink(Blog Area, Index, Home, new { area = Blog }, null)%>
br />br />
%= Html.ActionLink(Help Desk Area, Index, Home, new { area = HelpDesk }, null)%>
br />br />
%= Html.ActionLink(Shopping Area, Index, Home, new { area = Shopping }, null)%
可以看到,上面使用了ActionLink()方法產生連結,注意其中的第4個引數,使用new {area=“Blog”}這樣形式的引數,指出呼叫的是哪一個area中action方法。
使用RedirectToAction
同樣,我們經常要在某個area中的action方法去呼叫另外一個area方法中的action,這個時候要如何做呢?程式碼如下:
public ActionResult Index()
return RedirectToAction(Index, Home, new { Area = HelpDesk });
這裡,使用了RedirectToAction方法去呼叫另外一個area中的action方法,同樣是使用了new {Area=“HelpDesk”}的方式,指定area的名稱即可,所以這裡呼叫了HelpDesk Area中的index()方法。
小結
在本文中,介紹了ASP.NET MVC中的Area的概念,Area模組化的方式,能將複雜的應用劃分為各個模組,並在每個模組中都能按照MVC的架構劃分檢視,實體和控制層的目錄架構,這樣更有利於專案的架構組織,更清晰容易在各模組之間進行對應的呼叫。
相關文章
- ASP.NET MVC系列:AreaASP.NETMVC
- ASP.NET MVC 異常處理ASP.NETMVC
- [ASP.NET MVC 小牛之路]08 - Area 使用ASP.NETMVC
- ASP.NET:MVC中檔案上傳與地址變化處理ASP.NETMVC
- ASP.NET MVC實踐系列-表單處理ASP.NETMVC
- flash_recovery_area故障處理
- Asp.net Core MVC 程式的國際化處理ASP.NETMVC
- ASP.Net請求處理機制初步探索之旅(5):ASP.Net MVC請求處理流程ASP.NETMVC
- asp.net core mvc 分頁ASP.NETMVC
- ASP.NET MVC 4使用PagedList.Mvc分頁ASP.NETMVC
- ASP.Net中的時間處理ASP.NET
- .NET/ASP.NET MVC(模組化開發AraeRegistration)ASP.NETMVC
- asp.net mvc easyui datagrid分頁ASP.NETMVCUI
- MVC字串處理及MVC@RenderSection小計MVC字串
- 死磕Spring原始碼-MVC處理HTTP分發請求Spring原始碼MVCHTTP
- 在Python中處理分數Python
- Jive中的分頁處理 (轉)
- 【ASP.NET Core】MVC模型繫結:非規範正文內容的處理ASP.NETMVC模型
- Asp.net mvc 各個元件的分離ASP.NETMVC元件
- ASP.NET 2.0中XML資料的處理ASP.NETXML
- Asp.Net MVC 中的 Cookie(譯)ASP.NETMVCCookie
- flash recovery area 空間滿了的處理辦法
- asp.net mvc 中利用jquery datatables 實現資料分頁顯示ASP.NETMVCjQuery
- iOS底層原理 MVC、MVP、MVVM、分層設計淺談 — (13)iOSMVCMVPMVVM
- MVC3使用Area解耦專案MVC解耦
- 深入解析ASP.NET Core MVC的模組化設計[下篇]ASP.NETMVC
- Spring mvc時間格式處理SpringMVC
- ASP.NET MVC中簡單使用AutofacASP.NETMVC
- asp.net mvc 中的部分檢視ASP.NETMVC
- Service 層異常拋到 Controller 層處理還是直接處理?Controller
- ASP.NET MVC下使用AngularJs語言(九):日期時間處理與顯示ASP.NETMVCAngularJS
- ASP.NET異常處理ASP.NET
- asp.net mvc 之旅 —— 第五站 從原始碼中分析asp.net mvc 中的TempDataASP.NETMVC原始碼
- ES6與CommonJS中的模組處理JS
- Excel縮排層級處理Excel
- IIS8釋出Asp.net MVC程式後出現404錯誤,處理程式staticFileASP.NETMVCC程式
- Spring MVC統一異常處理SpringMVC
- 【ASP.NET開發】ASP.NET(MVC)三層架構知識的學習總結ASP.NETMVC架構