1. 程式人生 > >MVC4 中使用 Area 和 註意的地方

MVC4 中使用 Area 和 註意的地方

fig 指定 兩個 one http log content 定義 pla

在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 和 註意的地方