前言
我們知道MVC項目各部分職責比較清晰,相比較ASP.NET Webform而言,MVC項目的業務邏輯和頁面展現較好地分離開來,這樣的做法有許多優點,比如可測試,易擴展等等。但是在實際的開發中,隨着項目規模的不斷擴大,Controller控制器也隨之不斷增多。如果在Controllers文件夾下面有超過兩位數controller,即便采用良好的命名規范,或者用子文件夾的形式區分不同功能的控制器,還是會影響項目的可閱讀性和可維護性。因此,在一些場景下,如果能把與某功能相關的文件分離到一個獨立的項目中是非常有用的。Asp.Net MVC提供了Areas(區域)的概念達到這一目的。
Web應用通常會有前台(面向用戶)和后台(面向管理員)兩部分,我們希望以/locahost/Admin開始的URL都為后台管理地址,
routes.MapRoute( //Default Route "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults );
這是默認的路由,我們希望后台可以通過這里的Url訪問,比如:localhost/Admin/{Controller}/{Action},那么我們可能就需要添加這樣一個路由
routes.MapRoute( //Admin Route "Admin", // Route name "Admin/{controller}/{action}/{id}", // URL with parameters new { controller = "Index", action = "Index", id = UrlParameter.Optional } // Parameter defaults );
但是我們如何在項目中使用呢……
正題
第一步我們需要在Web項目中添加一個區域,就是本次記錄的重點
我們將區域名稱命名為Admin,點擊確定后就會生成如圖所示的幾個文件和文件夾,當然是已Areas為根文件夾
我們打開AdminAreaRegistration.cs文件看一下
public class AdminAreaRegistration : AreaRegistration { public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } ); } }
系統為其自動添加了一個路由,也正是我們想要的,於是,我們便也添加了測試的AdminController,視圖View Index.
直接F5運行,然后通過Url訪問
那現在我們再添加一個HomeController的控制器,和Index的視圖,再次運行看看
這種情況需要修改一下AdminAreaRegistration.cs和Global.asax,分別為路由加上命名空間限制:
/Areas/Admin/AdminAreaRegistration.cs
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new string[] { "MvcArea.Areas.Admin.Controllers" } ); }
/Global.asax.cs
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // 路由名稱 "{controller}/{action}/{id}", // 帶有參數的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } , // 參數默認值 new string[] { "MvcArea.Controllers" } ); }
總結
這樣,我們就可以把所有與后台管理相關的Controller和View文件放到/Areas/Admin下面,以此類推,可以添加諸如會員(Member),博客(Blog),論壇(Forum)等多個Areas。各部分都有自己的頂層文件夾,物理文件都分離開來,管理起來比較方便。
這種方式已經有了很大提高,但是所有的文件還是放在同一個項目里面。當項目規模較大的時候,比較好的開發方式是將不同功能模塊按需要獨立到不同項目里面,最后再整合成一個整體。這樣,每一個項目可以獨立開發,測試和發布。至於進而的優化,我會抽時間繼續補上的。