[译]ASP.NET Core 2.0 区域
问题
如何将一个规模庞大的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 系列文章目录
[译]ASP.NET Core 2.0 区域的更多相关文章
- [译]ASP.NET Core 2.0 系列文章目录
基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...
- [译]ASP.NET Core 2.0 中间件
问题 如何创建一个最简单的ASP.NET Core中间件? 答案 使用VS创建一个ASP.NET Core 2.0的空项目,注意Startup.cs中的Configure()方法: public vo ...
- [译]ASP.NET Core 2.0 带初始参数的中间件
问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...
- [译]ASP.NET Core 2.0 全局配置项
问题 如何在 ASP.NET Core 2.0 应用程序中读取全局配置项? 答案 首先新建一个空项目,并添加两个配置文件: 1. appsettings.json { "Section1&q ...
- [译]ASP.NET Core 2.0 机密配置项
问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...
- [译]ASP.NET Core 2.0 会话状态
问题 如何在ASP.NET Core 2.0中存储会话状态? 答案 创建一个空项目,修改Startup类的ConfigureServices()方法,添加会话状态服务和它后台的存储服务: public ...
- [译]ASP.NET Core 2.0 本地文件操作
问题 如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息? 答案 新建一个空项目,修改Startup类,添加访问本地文件所需的服务: public void ConfigureSer ...
- [译]ASP.NET Core 2.0 网址重定向
问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter) ...
- [译]ASP.NET Core 2.0 路由引擎
问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(ISe ...
随机推荐
- kbhit()
kbhit() 非阻塞的响应键盘输入时间 C++函数 功能和返回值:检查是否有键盘输入 ,有返回非0 ,无返回0 int khbit(void) 头文件: #include<conio.h& ...
- Cornfields poj2019 二维RMQ
Cornfields Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Submit S ...
- bzoj3224 普通平衡树(c++vector)
Tyvj 1728 普通平衡树 2014年8月23日6,4365 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有 ...
- UWP 改变Button样式
-----some words------ 1.Control:控制 (我们理解成控件) 2.Template:模板 3.Ellipse 椭圆 4.Content 内容 5.Presenter 节目主 ...
- 为什么说程序员都应该玩一玩GitHub
既熟悉又陌生的GitHub 关于GitHub,相信每一个程序员都再熟悉不过了.它为开发者提供Git仓库的托管服务,是全世界最大的代码集中地,被戏称为“全球最大同性交友网站”. 但是对于很大一部分程序员 ...
- win10 uwp 进度条 Marquez
本文将告诉大家,如何做一个带文字的进度条,这个进度条可以用在游戏,现在我做的挂机游戏就使用了他. 如何做上图的效果,实际需要的是两个控件,一个是显示文字 的 TextBlock 一个是进度条. 那么如 ...
- 二:Linux 的基本命令、VI编辑器、Linux中软件安装
Linux 的基本命令 1. 文件操作 a) Windows 是多根的文件系统,物理上是 1 到多块硬盘,逻辑上分为 C.D.E--盘, 每个盘都是一棵树.Linux 是单根的文件系统,不分 CDE ...
- day2_python的数据类型,sys,os模块,编码解码,列表,字典
今天主要了解了python的数据类型,sys,os模块,编码解码,列表,字典 1.数据类型:int(python3没有长整型)文本总是Unicode,str表示二进制用byte类表示布尔型:True( ...
- GTK主题黑边问题
Linux就是这样,上游一出点什么奇怪的变动,下游程序就要受影响..最近滚了一下后,不知道mesa还是xf86-intel-video哪个玩了什么新花样,所有gtk应用[主要是gnome组件]全部自带 ...
- MongoDB正则表达式
MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式. 1. 搜索包含某关键字的内容: db.posts.find({post_text:{$regex:"w3cschoo ...