[译]ASP.NET Core 2.0 区域
问题
如何将一个规模庞大的ASP.NET Core 2.0应用程序进行逻辑分组?
答案
新建一个ASP.NET Core 2.0空项目,修改Startup类,增加Mvc服务和中间件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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]特性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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参数(下面小节会详细讨论):
1 2 3 4 5 6 7 8 9 10 | < 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]特性来标识每个控制器了:
1 2 3 4 | [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区域的布局页面如何使用外部布局页面(注意为了引用外部布局页面,你需要指定绝对路径):
1 2 3 4 5 6 7 8 9 10 | @{ 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/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2015-11-09 FineUI(开源版)v4.2.2发布(8年125个版本,官网示例突破300个)!