幸運的是,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 override string AreaName
{
get
{
return " HelpDesk " ;
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
" HelpDesk_default " ,
" HelpDesk/{controller}/{action}/{id} " ,
new { action = " Index " , id = UrlParameter.Optional }
);
}
}
可以看到,HelpDeskAreaRegistration類覆寫了AreaName屬性和RegisterArea方法。RegisterArea方法則在MVC中注冊了新的路由信息。
在每一個area中都必須有一個象這樣的注冊類。但什么時候去使用這些注冊的類呢?如果打開Global.asx這個文件,會發現在Application_Start事件中會發現如下代碼:
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
這里讀者可以看到,調用了AreaRegistration類的靜態方法RegisterAllAreas()去注冊所有的are注冊文件,而RegisterAllAreas()方法會去逐一調用應用中所有area的RegisterArea()方法。
接下來,在主程序及每個area中都增加HomeController,這樣,就會有四個以HomeController命名的控制類,如下所示:
{
public ActionResult Index()
{
return View();
}
}
同樣,鼠標右擊每個Index()方法,在彈出的菜單中新增加一個Index視圖,這樣總共有4個index視圖頁面。運行應用,可以看到如下圖的效果,下圖是其中運行HelpDesk Area時的效果,請留意其中的URL
Areas之間的調用
ASP.NET MVC中,經常需要在控制層的不同方法之間進行互相調用。如果沒特別指定,則默認為同一個area中的action方法和控制器之間的調用。如果需要在不同的area之間進行互相調用,可以使用如下方法:
< 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,這個時候要如何做呢?代碼如下:
{
return RedirectToAction( " Index " , " Home " , new { Area = " HelpDesk " });
}
這里,使用了RedirectToAction方法去調用另外一個area中的action方法,同樣是使用了new {Area=“HelpDesk”}的方式,指定area的名稱即可,所以這里調用了HelpDesk Area中的index()方法。
小結
在本文中,介紹了ASP.NET MVC中的Area的概念,Area模塊化的方式,能將復雜的應用划分為各個模塊,並在每個模塊中都能按照MVC的架構划分視圖,實體和控制層的目錄架構,這樣更有利於項目的架構組織,更清晰容易在各模塊之間進行對應的調用。