Asp.net MVC 基於Area的路由映射


對於一個較大規模的Web應用,我們可以從功能上通過Area將其划分為較小的單元。每個Area相當於一個獨立的子系統,具有一套包含Models、Views和Controller在內的目錄結構和配置文件。一般來說,每個Area具有各自的路由規則(URL模版上一般會體現Area的名稱),而基於Area的路由映射通過AreaRegistration進行注冊。

一、創建Areas

  右鍵工程 -> 添加->區域  

添加后生成一套包含Models、Views和Controller在內的目錄結構和配置文件;只是多了一個 HomeAreaRegistration.cs文件

系統自動生成HomeAreaRegistration類 繼承AreaRegistration

    public class HomeAreaRegistration : AreaRegistration
    {

        public override string AreaName
        {
            get
            {
                return "Home";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Home_default",
                "Home/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }

 

AreaRegistration:

  // 摘要: 
    //     提供在 ASP.NET MVC 應用程序內注冊一個或多個區域的方式。
    public abstract class AreaRegistration
    {
        // 摘要: 
        //     初始化 System.Web.Mvc.AreaRegistration 類的新實例。
        protected AreaRegistration();

        // 摘要: 
        //     獲取要注冊的區域的名稱。
        //
        // 返回結果: 
        //     要注冊的區域的名稱。
        public abstract string AreaName { get; }

        // 摘要: 
        //     注冊 ASP.NET MVC 應用程序中的所有區域。
        public static void RegisterAllAreas();
        //
        // 摘要: 
        //     使用指定的用戶定義信息在 ASP.NET MVC 應用程序內注冊所有區域。
        //
        // 參數: 
        //   state:
        //     一個包含要傳遞到區域中的用戶定義信息的對象。
        public static void RegisterAllAreas(object state);
        //
        // 摘要: 
        //     使用指定區域的上下文信息在 ASP.NET MVC 應用程序內注冊某個區域。
        //
        // 參數: 
        //   context:
        //     對注冊區域所需的信息進行封裝。
        public abstract void RegisterArea(AreaRegistrationContext context);
    }

 

RegisterArea 方法不需要我們手動去調用,在 Global.asax 中的 Application_Start 方法已經有下面這樣一句代碼為我們做好了這件事:

 AreaRegistration.RegisterAllAreas();
 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles); 

        }

 

這時候如果你在 根目錄的 Controller 文件 已經新建了一個HomeController  運行工程項目會報錯,會提示已經存在Home

當Area被注冊的時候,Area中定義的路由被限制了只尋找 Area 中的Controller。然而我們在RouteConfig.cs文件的RegisterRoutes方法中定義的路由並沒有類似的限制

這時候在系統默認路由配置RouteConfig.cs文件中做修改

配置中添加 namespaces 指定命名空間 

添加了 namespaces 參數后,路由系統在對這個路由進行匹配時,優先匹配指定命名空間的controller,如果匹配到則即刻停止查找,如果在指定的命名空間下沒有匹配到對應的controller,再按照一般的方式進行匹配。

    public class RouteConfig
    {

        private static string[] namespaces = new string[1] { "Bp.GMS.Web.Controllers" };
        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: namespaces 
            );
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM