Area包含:前端
建立一個空MVC工程結構相似,Admin Area 有本身的 Controllers、Models 和 Views 文件夾,不同的地方就是多了一個 AdminAreaRegistration.cs 文件,這個文件中定義了一個叫 AdminAreaRegistration 的類,它的內容以下:根目錄能夠放一套同樣的結構用來作前端開發使用,而admin 目錄通常會做爲管理員後臺來開發!ide
AdminAreaRegistration.cs 文件,這個文件中定義了一個叫 AdminAreaRegistration 的類,它的內容以下:url
namespace MvcApp4.Areas.Admin { 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" } //指定該路由查找控制器類的命名空間 ); } } }
在這裏須要注意需加入 Areas 所在的命名空間,來控制 controllers 接收的參數,否則訪問會出現錯誤,往下一點會提到。spa
namespaces: new[] { "MvcApp4.Areas.Admin.Controllers" } AreaRegistrationContext 類的 MapRoute 方法和 App_Start-> RouteConfig.cs 的 MapRoute 方法的使用是同樣的,只是區分Area 目錄下的路由控制!
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
調用 AreaRegistration.RegisterAllAreas 方法讓MVC應用程序在啓動後會尋找全部繼承自 AreaRegistration 的類,併爲每一個這樣的類調用它們的 RegisterArea 方法。code
下面咱們來作一個 Demoblog
新建兩個訪問鏈接,內容都是同樣,都是簡單輸出一個 "hello World"繼承
URL定位到 (areas/admin)路由
http://localhost:18291/Admin/Home/Index開發
URL定位到(根目錄)get
http://localhost:18291/Home/Index
public class HomeController : Controller { // // GET: /Admin/Home/ public ActionResult Index() { return Content("hello world"); } }
若是剛纔沒有加入: 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 ); } }
這樣訪問時就能夠區分 , 不一樣目錄的 controller