MVC教程:MVC區域路由


一、區域路由

為了管理網站中大量的文件,在ASP.NET MVC 2.0版本中引入了一個新概念:區域(Area)。

有了區域以后,可以讓我們的項目不至於太復雜而導致管理混亂。每個模塊的頁面都放入相應的區域內進行管理很方便。看下面的截圖:

上圖中有兩個模塊:一個是User模塊,另一個是Product模塊,所有關於這兩個模塊的Controller、Model、View都放入各自的模塊內。而且從上圖中可以看出:區域的功能就類似於一個小的MVC項目,雖然項目小,但是有自己的控制器、模型、視圖和路由設置。

區域實際上就是應用程序內部的一個MVC結構,一個應用程序可能包含若干個MVC結構(區域)。例如:一個大型的電子商務網站可能分為若干個區域,這些區域分別代表產品,用戶等模塊,每個區域表示應用程序的一個獨立功能。

二、示例程序

上面講解了區域路由的概念及結構,下面從頭開始創建一個區域路由來演示如何創建區域路由。

1、新建區域路由

在項目上右鍵添加,然后選擇區域,如圖所示:

 

然后輸入區域名稱:AreaAdmin,如下圖所示:

點擊確定,然后區域創建完成:

2、注冊區域路由

2.1、區域路由文件

在MVC中添加一個區域以后,會默認幫我們注冊這個區域的路由規則。例如:我們剛才創建的AreaAdmin區域,然后幫我們生成了AreaAdminAreaRegistration.cs文件,其代碼如下:

using System.Web.Mvc;

namespace MVCStudyDemo.Areas.AreaAdmin
{
    public class AreaAdminAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "AreaAdmin";
            }
        }

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

 

 上面的代碼中,RegisterArea是實現注冊路由的方法,通過把一個路由添加到區域路由集合中實現。

2.2、全局注冊區域路由

上面的文件只是把路由添加到了區域路由集合中,要想使用區域路由,還需要進行全局注冊區域路由,全局注冊區域路由需要在Global.asax中注冊,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace MVCStudyDemo
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            // 注冊全局區域路由
            AreaRegistration.RegisterAllAreas();
            // 注冊Filter
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            // 注冊路由
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

 注意:AreaRegistration.RegisterAllAreas()在 RouteConfig.RegisterRoutes(RouteTable.Routes)的前面,這一點很關鍵,最好是不要改變這個順序。MVC路由系統是按照注冊路由的先后順序來匹配的,這里AreaRegistration.RegisterAllAreas()在前面表示MVC路由系統會先去匹配Area中的路由規則,如果改變了這個順序可能會找到錯誤的Controller。

三、測試區域路由

新建一個名為AdminHome的Controller和View,創建方式和使用普通MVC創建Controller和View一樣,修改Index對應的View視圖代碼如下:

@{
    ViewBag.Title = "Index";
}

<h2>這是AreaAdmin區域路由里面的Index視圖頁面</h2>

 瀏覽器運行效果如下:

這時在新建一個HomeController,對應的Index視圖代碼如下

@{
    ViewBag.Title = "Index";
}
<h2>這是AreaAdmin區域路由HomeController控制器里面的Index視圖頁面</h2>

 瀏覽器運行效果如下:

這時在訪問一下新建MVC項目時自帶的HomeController控制器的Index頁面,瀏覽器運行效果如下:

從上面的截圖中可以看出這時候在訪問就出錯了,因為程序中存在兩個HomeController,程序不知道要訪問哪個控制器,所以根據錯誤提示需要在區域路由里面添加namespace,區分一下兩個HomeController,區域路由中查看MapRoute的定義:

上面的代碼中可以看出:在MapRoute的重載函數中增加一個namespace即可區分不同的路由,修改RouteConfig后的路由規則如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MVCStudyDemo
{
    /// <summary>
    /// 路由:將URL地址匹配到相應Controller的Action方法
    /// </summary>
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            // 忽略路由 正則表達式 表示以.axd結尾的URL地址被忽略掉
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // 默認路由  一般不擴展路由,使用默認路由即可
            // 這里使用的是命名參數的形式 把name,url,default去掉也可以
            routes.MapRoute(
                // 路由名稱
                name: "Default",
                // 匹配規則(正則表達式)
                url: "{controller}/{action}/{id}",
                // 默認值   默認controller是Home action方法是Index id是可空的
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }  ,
                 // 添加命名空間
                 new string[] { "MVCStudyDemo" + ".Controllers" }
            );
        }
    }
}

 這時在訪問HomeController下面的Index方法就可以正常訪問了:

 


免責聲明!

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



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