網站首頁 編程語言 正文
一、區域路由
為了管理網站中大量的文件,在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"; }這是AreaAdmin區域路由HomeController控制器里面的Index視圖頁面
瀏覽器運行效果如下:
這時在新建一個HomeController,對應的Index視圖代碼如下
@{ ViewBag.Title = "Index"; }這是AreaAdmin區域路由HomeController控制器里面的Index視圖頁面
瀏覽器運行效果如下:
這時在訪問一下新建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 { ////// 路由:將URL地址匹配到相應Controller的Action方法 /// 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方法就可以正常訪問了:
原文鏈接:https://www.cnblogs.com/dotnet261010/p/10827065.html
相關推薦
- 2023-01-10 SpringEvent優雅解耦時連續兩個bug的解決方案_Golang
- 2021-12-10 antd react hooks From表單格式模板
- 2022-06-29 Python解決非線性規劃中經濟調度問題_python
- 2022-10-04 Python的getattr函數方法學習使用示例_python
- 2022-07-17 Android?studio實現簡單計算器的編寫_Android
- 2022-02-03 gogs倉庫代碼拉取不需要用戶賬號驗證問題
- 2023-10-17 css標簽畫圓形進度條
- 2022-07-03 nginx?緩存使用及配置步驟_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支