標籤:glob nal splay 程式 res root 指定 style ges
在MVC項目中經常會使用到Area來分開不同的模組讓項目結構更加的清晰。
步驟如下:
項目 –> 添加 -> 地區 (Area)
輸入 Admin
添加成功後
Area包含:
建立一個空MVC工程結構類似,Admin Area 有自己的 Controllers、Models 和 Views 檔案夾,不一樣的地方就是多了一個 AdminAreaRegistration.cs 檔案,這個檔案中定義了一個叫 AdminAreaRegistration 的類,它的內容如下:
根目錄可以放一套一樣的結構用來做前端開發使用,而admin 目錄一般會作為管理員後台來開發!
AdminAreaRegistration.cs 檔案,這個檔案中定義了一個叫 AdminAreaRegistration 的類,它的內容如下:
1 namespace MvcApp4.Areas.Admin 2 { 3 public class AdminAreaRegistration : AreaRegistration 4 { 5 public override string AreaName 6 { 7 get 8 { 9 return "Admin";10 }11 }12 13 public override void RegisterArea(AreaRegistrationContext context)14 {15 context.MapRoute(16 "Admin_default",17 "Admin/{controller}/{action}/{id}",18 new { controller = "home", action = "Index", id = UrlParameter.Optional },19 namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" } //指定該路由尋找控制器類的命名空間20 );21 }22 }23 }
View Code
在這裡需要注意需加入 Areas 所在的命名空間,來控制 controllers 接收的參數,不然訪問會出現錯誤,往下一點會提到。
namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" }
AreaRegistrationContext 類的 MapRoute 方法和 App_Start-> RouteConfig.cs 的 MapRoute 方法的使用是一樣的,只是區分Area 目錄下的路由控制!
在 Global.asax 中的 Application_Start 方法會自動加了這樣一句代碼
1 在這裡需要注意需加入 Areas 所在的命名空間,來控制 controllers 接收的參數,不然訪問會出現錯誤,往下一點會提到。2 3 namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" }4 5 AreaRegistrationContext 類的 MapRoute 方法和 App_Start-> RouteConfig.cs 的 MapRoute 方法的使用是一樣的,只是區分Area 目錄下的路由控制!6 7 在 Global.asax 中的 Application_Start 方法會自動加了這樣一句代碼
View Code
調用 AreaRegistration.RegisterAllAreas 方法讓MVC應用程式在啟動後會尋找所有繼承自 AreaRegistration 的類,並為每個這樣的類調用它們的 RegisterArea 方法。
下面我們來做一個 Demo
建立兩個訪問串連,內容都是一樣,都是簡單輸出一個 "hello World"
URL定位到 (areas/admin)
http://localhost:18291/Admin/Home/Index
URL定位到(根目錄)
http://localhost:18291/Home/Index
1 public class HomeController : Controller 2 { 3 // 4 // GET: /Admin/Home/ 5 6 public ActionResult Index() 7 { 8 return Content("hello world"); 9 }10 11 }
View Code
如果剛才沒有加入:
namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" }
運行後就會出現如下錯誤:
但是如果我們把根目錄下的 /Home/Index 的內容輸出改成 “Root Say hello World” , 你會發現還是輸出 “hello World”,
這是就是 Controller的歧義問題
這就是我們需要注意的另一個地方
我們需要在App_start下的 RouteConfig.cs 也要增加一個 namespaces 來聲明 Controller 訪問的命名空間!
//App_start下的 RouteConfig.cs public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "MvcApp4.Controllers" }//指定該路由尋找控制器類的命名空間 controllers ); } } //areas 下的 \Admin\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 { controller = "home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" } //對應的命名空間的 controllers ); } }
View Code
這樣訪問時就可以區分 , 不同目錄的 controller
MVC4 中使用 Area 和 注意的地方