問題
如何將一個規模龐大的ASP.NET Core 2.0應用程序進行邏輯分組?
答案
新建一個ASP.NET Core 2.0空項目,修改Startup類,增加Mvc服務和中間件:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(routes => { routes.MapRoute( name: "area", template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
創建目錄結構如下所示:
向Controllers和Views目錄中添加文件(其中Area1的目錄結構如下):
向Area1和Area2目錄中的控制器類添加[Area]特性:
namespace Areas.Areas.Area1.Controllers { [Area("Area1")] public class HomeController : Controller { public IActionResult Index() { return View(); } public IActionResult About() { return View(); } } }
運行,此時頁面顯示:
點擊超鏈接Area1/Home/Index,頁面顯示:
返回首頁,點擊超鏈接Area2/Home/Index,頁面顯示:
討論
MVC使用模型、視圖和控制器來分離應用程序的關注點。對于更大的應用程序,區域提供了一種將這三個關注點隔離到更高級別分組中的方法。例如,你可能希望將應用程序分隔成不同的模塊,每個模塊都包含自己的MVC結構。
為了支持路由,還有另外一個路由參數area(作為對controller和action參數的補充)。你可以將區域假想為控制器的命名空間。在當前請求上下文中,area路由參數也可以作為環境變量存在(無需顯示提供)。下面的示例中,由于頁面存在于Area1區域中,所以鏈接到本區域的超鏈接省略了area參數(下面小節會詳細討論):
<p><strong>You are here: </strong>Area1/Home/Index</p> <ul> <li><a asp-area="" asp-controller="Home" asp-action="Index">Home/Index</a></li> <li><a asp-area="" asp-controller="Home" asp-action="About">Home/About</a></li> <li><a asp-controller="Home" asp-action="Index">Area1/Home/Index</a></li> <li><a asp-controller="Home" asp-action="About">Area1/Home/About</a></li> <li><a asp-area="Area2" asp-controller="Home" asp-action="Index">Area2/Home/Index</a></li> <li><a asp-area="Area2" asp-controller="Home" asp-action="About">Area2/Home/About</a></li> </ul>
為了在項目中使用區域,你首先需要創建一個以Areas命名的目錄和每個具體的區域(包含其控制器、模型和視圖)。注意目錄結構的命名非常重要,因為MVC會按照如下順序查找視圖所在的位置:
一旦目錄結構創建成功,你就可以通過[Area]特性來標識每個控制器了:
[Area("Area1")] public class HomeController : Controller { }
生成鏈接
下面表格列出了生成超鏈接所需要的路由參數,其中From為超鏈接所在的頁面,To為超鏈接需要跳轉的頁面,鏈接格式為:{area}/{controller}/{action}。
如果省略路由參數,則意味著MVC會從當前請求上下文中檢索這些參數。為了便于維護,我個人覺得還是為每個路由參數都設置值來得方便。這篇文章所附帶的示例工程包含了不同頁面上的超鏈接,你可以觀察環境變量值是如何工作的:
From | To | 路由參數 |
Area1/Controller1/Action1 | Area1/Controller1/Action2 | asp-action="Action2" |
Area1/Controller1/Action1 | Area1/Controller2/Action1 | asp-controller="Controller2" asp-action="Action1" |
Area1/Controller1/Action1 | Area2/Controller1/Action1 |
asp-area="Area2" asp-controller="Controller1" asp-action="Action1" |
Area1/Controller1/Action1 | Controller1/Action1 | asp-area="" asp-controller="Controller1" asp-action="Action1" |
布局頁面
區域內部的Razor視圖可以使用外面的布局頁面(也就是根目錄下的/Views/Shared)。當然你可以為每個區域定義不同的布局頁面。另外一種方法就是在外部定義公共的布局頁面,然后區域內的布局頁面將其作為頁面布局,從而創建一個嵌套的布局頁面。下面顯示了Area2區域的布局頁面如何使用外部布局頁面(注意為了引用外部布局頁面,你需要指定絕對路徑):
@{ Layout = "/Views/Shared/_Layout.cshtml"; } <div> <nav style="background-color: lightgray"> <h2>Area2 Layout</h2> </nav> @RenderBody() </div>
源代碼下載
原文:https://tahirnaushad.com/2017/08/25/asp-net-core-2-0-mvc-areas/
ASP.NET Core 2.0 系列文章目錄
文章列表