问题

如何将一个规模庞大的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 系列文章目录

转载于:https://www.cnblogs.com/sanshi/p/7804857.html

[译]ASP.NET Core 2.0 区域相关推荐

  1. [译]ASP.NET Core 2.0 部分视图

    问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServi ...

  2. [译]ASP.NET Core 2.0 网址重定向

    问题 如何在ASP.NET Core 2.0中实现网址重定向? 答案 新建一个空项目,在Startup.cs文件中,配置RewriteOptions参数并添加网址重定向中间件(UseRewriter) ...

  3. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  4. [译]ASP.NET Core 2.0 带初始参数的中间件

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class ...

  5. asp.net core 3.0 更新简记

    asp.net core 3.0 更新简记 Intro 最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0,记录一下,升级踩过的坑以及经验总结,包括但 ...

  6. Amazing ASP.NET Core 2.0

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...

  7. ASP.NET Core 2.0 : 三. 项目结构

    ASP.NET Core 2.0 : 三. 项目结构 原文:ASP.NET Core 2.0 : 三. 项目结构 本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Cor ...

  8. .NET Core ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  9. diskgeniusv4.4.0_.NET Core 3.0及ASP.NET Core 3.0前瞻

    (给DotNet加星标,提升.Net技能) 转自:LineZerocnblogs.com/linezero/p/netcore3 前几天微软发布了< .NET Core 3.0 Preview ...

  10. ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现

    from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...

最新文章

  1. 第十五届智能车竞赛芯片选型浅析
  2. css的padding
  3. 网站域名过户查询_网站建设哪家好?网站建设怎么收费?
  4. Spark SQL 处理流程分析 (一)
  5. java程序课程总结_Java课程总结报告.pdf
  6. 广实1592: 1.6-06:校门外的树
  7. 用C语言统计给定文本文件中汉字的个数
  8. java调用iec61850_IEC61850开发实战(三)
  9. Python读写Excel简单案例及调试说明文档
  10. qt调用SSDP协议
  11. vbs格式编程教程基础
  12. 如何提升数据化管理效率
  13. stm32核心板可以点亮灯吗_不忘初心牢记使命——自动化科协自行设计开发stm32仿真器...
  14. 基于SSM的设备租赁管理系统
  15. 勇者斗恶龙服务器没有响应,PC版勇者斗恶龙英雄打不开怎么办?
  16. 什么是 Redis ?
  17. 双拼、kotlin、依赖倒置
  18. oracle怎么赋予系统权限,讲解Oracle系统中用户权限的赋予和查看
  19. Android 人脸解锁
  20. 【halcon机器视觉教程】黑洞是什么洞?我来给你拍个照,黑洞成像系统

热门文章

  1. NV21转YUV420SP的代码
  2. 拿工资,要做差不多的事
  3. 听通灵人说自己的感悟
  4. DEBUG模式下,视频丢包严重;RELEASE就好了
  5. 领导公开对你有成见,关键在于是否影响公司决策
  6. 完全二叉树的节点数量
  7. redirect重定向中可以带参数吗_关于Laravel重定向的七种方法详解
  8. linux 查看特定多个文件的总量
  9. C# WinForm 开软件窗口居中 任意时刻窗体居中
  10. android设计个人简历页面_制作个人简历网站教程