問題
如何將一個規模龐大的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/