[ASP.NET MVC 小牛之路]08 - Area 使用
[ASP.NET
MVC 小牛之路]08 - Area 使用
ASP.NET MVC允許使用 Area(區域)來組織Web應用程序,每個Area代表應用程式的不同功能模組。這對於大型的工程非常有用,Area 讓每個功能模組都有各自的資料夾,資料夾中有自己的Controller、View和Model,但對於管理也增加了一定的難度。
本文目錄
建立Area
右鍵工程選擇新增->區域,彈出如下填入Area的對話框:
點擊新增後,工程目錄一個空MVC工程結構類似,Admin Area 有自己的Controllers、Models 和Views 資料夾,不一樣的地方就是多了一個AdminAreaRegistration.cs 文件,這個文件中定義了一個叫AdminAreaRegistration 的類,它的內容如下:
namespace MvcApplication1.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 { action = "Index", id = UrlParameter.Optional } ); } } }
系統自動產生的AdminAreaRegistration 類別繼承至抽象類別AreaRegistration,並重寫
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
調用AreaRegistration.RegisterAllAreas 方法讓MVC應用程序在啟動後會尋找所有繼承自AreaRegistration 的類,並為每個這樣的類別呼叫它們的RegisterArea 方法。
注意:不要輕易改變Application_Start 中註冊方法的順序,如果你把RouteConfig.RegisterRoutes方法放到AreaRegistration.RegisterAllAreas方法之前,Area 路由的註冊將會在路由註冊之後,路由系統是按順序來匹配的,所以這樣做會讓請求Area 的Controller 配對到錯誤的路由。
Area的運行
在Area中添加controller、view和model和一般的添加是一樣的。在這,我們在Admin Area中添加一個名為Home 的controller,代碼如下:
public class HomeController : Controller { public ActionResult Index() { return View(); } }
然後我們再為Index Acton添加一個View,代碼如下:
@{ ViewBag.Title = "Index"; Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <p> <h2 id="Admin-nbsp-Area-nbsp-Index">Admin Area Index</h2> </p> </body> </html>
運行應用程序,然後將URL定位到/Admin /Home/Index,以下是運行結果:
到這,我們已經看到,Area中的工作流程其實就是和根目錄下的流程是一樣的。但Area並不是一個完全獨立的工作空間,我們下面來看看。
Controller的歧義問題
試想一下,如果我們現在在根目錄的Controller 資料夾中也加入一個名為Home 的Controller,然後我們透過把URL定位到/Home/Index,路由系統能匹配到根目錄下的Controller 嗎?
在根目錄的Controllers 資料夾中添加好HomeController 後,為Index添加View,內容隨意:
... <body> <p> <h2 id="Root-nbsp-Index">Root Index</h2> </p> </body> ...
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 } ); }
運行程序,將URL定位到/Home/Index。結果我們會看到以下錯誤訊息:
出现这个问题是因为路由系统进行匹配的时候出现了Controller同名的歧义。
当Area被注册的时候,Area中定义的路由被限制了只寻找 Area 中的Controller,所以我们请求 /Admin/Home/Index 时能正常得到 MvcApplication1.Areas.Admin.Controllers 命名空间的 HomeController。然而我们在RouteConfig.cs文件的RegisterRoutes方法中定义的路由并没有类似的限制。
为了解决这个问题,我们需要在RouteConfig.cs文件中定义的路由中加上对应的 namespaces 参数。RouteConfig.cs 中修改后的路由如下:
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[] { "MvcApplication1.Controllers" } ); }
运行程序,如下结果说明解决了同名歧义问题:
添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。
生成Area URL链接
关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接;第二种是生成指向其他Area的链接;第三种是在某个Area中生成指向根目录的链接。下面是这三种情况生成链接的方法,使用的路由定义是系统默认的。
如果要在Area中生成当前Area的URL链接,直接用下面的方法就行:
@Html.ActionLink("Click me", "About")
它根据当前所在的Area和Controller会生成如下Html代码:
<a href="/Admin/Home/About">Click me</a>
如果要生成其他Area的URL链接,则需要在Html.ActionLink方法的匿名参数中使用一个名为area的变量来指定要生成链接的Area名称,如下:
@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })
它会根据被指定的Area去找路由的定义,假定在Support Area中定义了对应的路由,那么它会生成如下链接:
<a href="/Support/Home/Index">Click me to go to another area</a>
以上就是[ASP.NET MVC 小牛之路]08 - Area 使用的内容,更多相关内容请关注PHP中文网(www.php.cn)!
如果要在当前Area生成指根目录某个controller的链接,那么只要把area变量置成空字符串就行,如下:@Html.ActionLink("Click me to go to top-level part", "Index", new { area = "" })
它会生成如下Html链接:<a href="/Home/Index">Click me to go to top-level part</a>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

引言在當今快速發展的數位世界中,建立健壯、靈活且可維護的WEB應用程式至關重要。 PHPmvc架構提供了實現這一目標的理想解決方案。 MVC(模型-視圖-控制器)是一種廣泛使用的設計模式,可將應用程式的各個方面分離為獨立的元件。 MVC架構的基礎MVC架構的核心原理是分離關注點:模型:封裝應用程式的資料和業務邏輯。視圖:負責呈現資料並處理使用者互動。控制器:協調模型和視圖之間的交互,管理使用者請求和業務邏輯。 PHPMVC架構phpMVC架構遵循傳統MVC模式,但也引進了語言特定的功能。以下是PHPMVC

mvc架構(模型-視圖-控制器)是PHP開發中最受歡迎的模式之一,因為它為組織程式碼和簡化WEB應用程式的開發提供了清晰的結構。雖然基本的MVC原理對於大多數Web應用程式來說已經足夠,但對於需要處理複雜資料或實現高級功能的應用程序,它存在一些限制。分離模型層分離模型層是高階MVC架構常見的技術。它涉及將模型類分解為較小的子類,每個子類專注於特定功能。例如,對於一個電子商務應用程序,您可以將主模型類別分解為訂單模型、產品模型和客戶模型。這種分離有助於提高程式碼的可維護性和可重複使用性。使用依賴注入依賴

SpringMVC框架解密:為什麼它如此受歡迎,需要具體程式碼範例引言:在當今的軟體開發領域中,SpringMVC框架已經成為開發者非常喜愛的一種選擇。它是基於MVC架構模式的Web框架,提供了靈活、輕量、高效的開發方式。本文將深入探討SpringMVC框架的魅力所在,並透過具體的程式碼範例來展示其強大之處。一、SpringMVC框架的優勢靈活的配置方式Spr

MVC(Model-View-Controller)模式是一種常用的軟體設計模式,可以幫助開發人員更好地組織和管理程式碼。 MVC模式將應用程式分為三個部分:模型(Model)、視圖(View)和控制器(Controller),每個部分都有自己的角色和職責。在本文中,我們將討論如何使用PHP實作MVC模式。模型(Model)模型代表應用程式的資料和資料處理。通常,

如何在PHP8框架中實現可擴展的MVC架構引言:隨著互聯網的快速發展,越來越多的網站和應用程式採用了MVC(Model-View-Controller)架構模式。 MVC架構的主要目標是將應用程式的不同部分分開,以便提高程式碼的可維護性和可擴展性。在本文中,我們將介紹如何在PHP8框架中實現可擴充的MVC架構。一、了解MVC架構模式MVC架構模式是一種軟體設

在Web開發中,MVC(Model-View-Controller)是一種常用的架構模式,用於處理和管理應用程式的資料、使用者介面和控制邏輯。 PHP作為流行的Web開發語言,也可以藉助MVC架構設計和建構Web應用程式。本文將介紹如何在PHP中使用MVC架構設計項目,並說明其優點和注意事項。什麼是MVCMVC是一種軟體架構模式,通常用於Web應用程式中。 MV

PHP8框架開發MVC:初學者需要知道的重要概念和技巧引言:隨著網路的快速發展,Web開發在當今的軟體開發產業中扮演著重要的角色。 PHP被廣泛用於Web開發,並且有許多成熟的框架可以幫助開發人員更有效率地建立應用程式。其中,MVC(Model-View-Controller)架構是最常見且廣泛使用的模式之一。本文將介紹初學者在使用PHP8框架開發MVC應用程

模型-視圖-控制器(mvc)架構是一種強大的設計模式,用於建立可維護且可擴展的WEB應用程式。 PHPMVC架構將應用程式邏輯分解為三個不同的元件:模型:表示應用程式中的資料和業務邏輯。視圖:負責呈現資料給使用者。控制器:充當模型和視圖之間的橋樑,處理使用者請求並協調其他元件。 MVC架構的優點:程式碼分離:MVC將應用程式邏輯與表示層分離,提高了可維護性和可擴充性。可重複使用性:視圖和模型元件可以跨不同的應用程式重複使用,減少重複程式碼。效能優化:MVC架構允許快取視圖和模型結果,從而提高網站速度。測試友善:分離
