轉載:http://www.lanhusoft.com/Article/217.html
在大型的ASP.NET mvc5項目中一般都有許多個功能模塊,這些功能模塊可以用Area(中文翻譯為區域)把它們分離開來,比如:Admin,Customer,Bill。ASP.NET MVC項目中把各個功能分為不同Area的之后每一個Area都有獨立的Controller,View文件結構。這樣可以把這些功能分給不同的開發者同時開發而彼此之間不會沖突,這樣的文件結構各司其職,直觀明了,易於維護和管理。下面我們看看怎么在ASP.NET MVC5中創建一個Area和Area直接之間鏈接的處理。
一、ASP.NET MVC5中創建Area區域
選中我們的ASP.NET MVC項目,右鍵菜單,添加=》區域,這里我們取名為Admin,在項目根目錄將會生成一個Admin文件夾,如下圖:
我們來看這個Area是怎么在項目的起作用的。
我們來看Global.asax.cs的代碼:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }
第一行的代碼:AreaRegistration.RegisterAllAreas();就是注冊 ASP.NET MVC 應用程序中的所有區域。每一個區域它有自己的都有獨立的Controller,View文件結構和路由配置,我們完全可以把ASP.NET MVC的區域看成一個ASP.NET MVC項目。
注意: RouteConfig.RegisterRoutes(RouteTable.Routes)在AreaRegistration.RegisterAllAreas();的后面。這一點很關鍵,你最好是不要改變這個順序。之前我們談到過ASP.NET MVC路由系統是按注冊路由的先后順序來匹配的,這里RegisterAllAreas在前面表示MVC路由系統會先去匹配Area中的路由配置規則,如果你改變了順序可能會找到錯誤的Controller,發生意外的錯誤。
在ASP.NET MVC5的每個區域都有一個類:區域名+AreaRegistration,比如我們剛才建的一個Admin區域AdminAreaRegistration類:
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 } ); } }
這個類的作用主要是用於標示區域名稱和區域Controller的路由,可以看到路由規則為"Admin/{controller}/{action}/{id}",前面統一跟了一個Admin。
二、在Area區域的視圖之間Action的鏈接跳轉的處理
當在ASP.NET MVC項目中使用了AreaArea區域后,會涉及到不同Area的Action鏈接之間相互跳轉,我使用Html.ActionLink有些地方需要注意。
1、同一個Area之間跳轉
在Area區域的視圖中生成指向同一個Area的Action鏈接時,你不需要做任何處理,當你調用Html.ActionLink時MVC框架自動去找當前Area的相應路由來生成Action的鏈接。如下:
- @Html.ActionLink("Click me", "About")
生成下面的html:
- <a href="/Admin/Home/About">Click me</a>
2、不同Area之間跳轉
- @Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })
把Route中的area指定就可以了。
3、跳轉到不帶Area的Action
我們知道使用Html.ActionLink沒有指定area,默認就是當前的area。有時我們需要鏈接到頂層的Controller的Action,就是不要帶area,也很簡單,只需要把area傳空字符串就可以了。如下:
@Html.ActionLink("Click me to go to another area", "Index", new { area = "" })