MVC 添加Area

在MVC項目中常常會使用到Area來分開不一樣的模塊讓項目結構更加的清晰。

步驟以下:

項目 –> 添加 -> 區域 ( Area )

輸入 Admin

添加成功後

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 目錄下的路由控制!

在 Global.asax 中的 Application_Start 方法會自動加了這樣一句代碼

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

相關文章
相關標籤/搜索