區域塊路由與全局路由兼容,雙重路由

在添加了區域塊後,若是全局路由默認頁設置的是區域塊中的頁面,則最外層控制器文件夾中的頁面不知如何訪問,若是兼容呢?html

就是在全局如由,及自定義區域路由中設置namespaces前端

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

步驟以下:url

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

 輸入 Admincode

添加成功後htm

Area包含:
建立一個空MVC工程結構相似,Admin Area 有本身的 Controllers、Models 和 Views 文件夾,不同的地方就是多了一個 AdminAreaRegistration.cs 文件,這個文件中定義了一個叫 AdminAreaRegistration 的類,它的內容以下:blog

 

根目錄能夠放一套同樣的結構用來作前端開發使用,而admin 目錄通常會做爲管理員後臺來開發!路由

 

AdminAreaRegistration.cs 文件,這個文件中定義了一個叫 AdminAreaRegistration 的類,它的內容以下:開發

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 接收的參數,否則訪問會出現錯誤,往下一點會提到。

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);
}

 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
            );
        }
    }

 

 

參考:

http://www.javashuo.com/article/p-ssnrrvui-dt.html

http://www.javashuo.com/article/p-nqeqsmpq-gs.html

相關文章
相關標籤/搜索