Areas(区域)
Areas(区域)
原文:Areas
作者:Dhananjay Kumar 和 Rick Anderson
翻译:耿晓亮(Blue)
校对:许登洋(Seay)
Areas 是 ASP.NET MVC 用来将相关功能组织成一组单独命名空间(路由)和文件夹结构(视图)的功能。使用 Areas 创建层次结构的路由,是通过添加另一个路由参数 area 到 Controller 和 action。
Areas 提供了一种把大型 ASP.NET Core MVC Web 应用程序分为较小的功能分组的方法。Area 是应用程序内部一个有效的 MVC 结构。在 MVC 项目中,像 Model,Controller 和 View 的逻辑组件放在不同的文件夹中,MVC 用命名约定来创建这些组件间的关系。对于大型应用,它有利于把应用分割成独立高级功能的 Areas。例如,一个多业务单元的电子商务应用,如结账,计费和搜索等。每个单元都有自己的逻辑组件:视图、控制器和模型。在这种情况下,你可以用 Areas 在同一项目中物理分割业务组件。
在 ASP.NET Core MVC 项目中 Area 被定义成有自己的一套 controller,view 和 model 的较小的功能单元。
当有下列情况时应当考虑在 MVC 项目中用 Areas:
- 你的应用程序应该从逻辑上分隔成多个高级功能组件的
- 你想要分隔你的 MVC 项目,使每一个功能 area 可以独立工作
Area 特性:
- 一个 ASP.NET Core MVC 应用可以有任意数量的 area
- 每一个 area 都有自己的控制器、模型和视图
- 允许把大型 MVC 项目组织成多个高级组件以便可以独立工作
- 支持具有相同名称的多个控制器 - 只要它们有不同的 areas
让我们看一个例子,说明如何创建和使用 Areas。比如在一个商店应用程序里有两个不同分组的控制器和视图:Products 和 Services。下一个典型的文件夹结构,使用 MVC Area 看起来像下面:
- Project name
- Areas
- Products
- Controllers
- HomeController.cs
- ManageController.cs
- Views
- Home
- Index.cshtml
- Manage
- Index.cshtml
- Services
- Controllers
- HomeController.cs
- Views
- Home
- Index.cshtml
当 MVC 尝试在 Area 中渲染一个视图时,默认情况下,会尝试在下面位置中查找:
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
这些默认的位置可以通过Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions 的 AreaViewLocationFormats 方法被修改。
例如,在下面的代码中文件夹名为 ‘Areas’,它被修改为 ‘Categories’。
services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/Categories/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Categories/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
需要注意的是 Views 文件夹结构是唯一需要重点考虑的并且剩余文件夹像 Controllers 和 Models 的内容并不重要。比如,根本不需要 Controllers 和 Models 文件夹。这是因为 Controllers 和 Models 的内容只是编译成一个 .dll 的代码不是作为 Views 的内容直到 view 被请求。
一旦定义了文件夹层次结构,需要告诉 MVC 每一个相关的 area 的 controller。用 [Area] 特性修饰控制器名称。
...
namespace MyStore.Areas.Products.Controllers
{
[Area("Products")]
public class HomeController : Controller
{
// GET: /Products/Home/Index
public IActionResult Index()
{
return View();
}
// GET: /Products/Home/Create
public IActionResult Create()
{
return View();
}
}
}
用新创建的 areas 设置一个路由的定义。Routing to Controller Actions 详细介绍了如何创建路由定义, 包括使用传统路由与特性路由。在本例中,我们会用传统路由。想这样做, 只需打开 Startup.cs 文件并通过添加下边高亮的路由定义修改它。
...
app.UseMvc(routes =>
{
routes.MapRoute(name: "areaRoute",
template: "{area:exists}/{controller=Home}/{action=Index}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}");
});
浏览 http:///products, Products area 中 HomeController 的 Index 方法将会被调用。
生成链接
从一个基础 controller 的 area 中的方法生成链接到同一 controller 的另一个方法。
当前请求路径像/Products/Home/Create
HtmlHelper 语法:@Html.ActionLink("Go to Product's Home Page", "Index")
TagHelper 语法:<a asp-action="Index">Go to Product's Home Page</a>
注意这里不需要提供 ‘area’ 和 ‘controller’ 值因为他们在当前请求上下文中已经可用。这种值被称作ambient值。从一个基础 controller 的 area 中的方法生成链接到不同 controller 的另一个方法。
当前请求路径像/Products/Home/Create
HtmlHelper 语法:@Html.ActionLink("Go to Manage Products’ Home Page", "Index", "Manage")
TagHelper 语法:<a asp-controller="Manage" asp-action="Index">Go to Manage Products’ Home Page</a>
注意这里用的 ‘area’ 环境值是上面 ‘controller’ 明确指定的。从一个基础 controller 的 area 中的方法生成链接到不同 controller 和不同 area 另一个方法。
当前请求路径像/Products/Home/Create
HtmlHelper 语法:@Html.ActionLink("Go to Services’ Home Page", "Index", "Home", new { area = "Services" })
TagHelper 语法:<a asp-area="Services" asp-controller="Home" asp-action="Index">Go to Services’ Home Page</a>
注意这里没有环境值被用。从一个基础 controller 的 area 中的方法生成链接到不在一个 area 中的不同 controller 的另一个方法。
HtmlHelper 语法:@Html.ActionLink("Go to Manage Products’ Home Page", "Index", "Home", new { area = "" })
TagHelper 语法:<a asp-area="" asp-controller="Manage" asp-action="Index">Go to Manage Products’ Home Page</a>
因此生成链接到非 area 的基础 controller 方法,清空了这里 ‘area’ 的环境值。
发布 Areas
发布 areas 文件夹的所有 view,在 project.json 包含一个条目在 publishOptions 的 include 节点如下:
"publishOptions": {
"include": [
"Areas/**/*.cshtml",
....
....
]
文章地址:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_6-areas.html
原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
Areas(区域)的更多相关文章
- 使用Areas(区域)分离ASP.NET MVC 项目
在使用Areas区域时,如果使用默认路由表,将造成路由表冲突,这种情况需要修改一下区域内<区域名称>AreaRegistration.cs和/App_Start/RouteConfig.a ...
- asp.net MVC把Areas区域绑定成二级域名
先分析需求 在MVC项目中,我们如果有两个Areas.比如Test和DEMO.我们的访问地址应该是 http://localhost:8098/test http://localhost:8098/d ...
- ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 Areas区域说明
https://www.cnblogs.com/webapi/p/5976642.html Asp.Net MVC Areas区域说明 一般网站分为前台+会员后台+管理员后台,做过webform的 ...
- Asp.Net MVC Areas区域说明
一般网站分为前台+会员后台+管理员后台,做过webform的人都会把会员后台页面放在user中,把管理员后台页面放在admin中 会员后台访问:www.xxx.com/user/xxx.aspx 管理 ...
- .net core Areas区域
//使用MVC app.UseMvc(routes => { routes.MapRoute( name: "areas", template: "{area:ex ...
- .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加
在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...
- ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- 使用Areas分离ASP.NET MVC项目
为什么需要分离? 我们知道MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等.但是在实际 ...
- ASP.NET MVC3 Areas 分离项目 同名控制器(同名Controller) 演示demo
为什么需要分离? 我们知道MVC项目各部分职责比较清晰,相比较ASP.NET Webform而言,MVC项目的业务逻辑和页面展现较好地分离开来,这样的做法有许多优点,比如可测试,易扩展等等.但是在实际 ...
随机推荐
- VC中获取窗体句柄的各种方法
AfxGetMainWnd AfxGetMainWnd获取自身窗体句柄 HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow 函数功能:该函数检查与 ...
- 基于x86架构的内核Demo的详细开发文档
http://hurlex.0xffffff.org/ 这里是hurlex这个基于x86架构的内核Demo的详细开发文档, 包含PDF文档和生成PDF的XeLaTex源码和文档每章节的阶段代码. 你可 ...
- Improving Lock Performance in Java--reference
After we introduced locked thread detection to Plumbr couple of months ago, we have started to recei ...
- hdu1016JAVA
import java.util.Arrays;import java.util.Scanner;public class Main { public static int kase=0,n; pub ...
- TCP/IP协议原理与应用笔记14:电路交换 和 分组交换
1. 电路交换: (1)建立连接 (2)数据传输 (3)拆除连接 2. 分组交换 (1)数据报: 根据网络的特性,将数据报分成不同大小的部分,经过不同网路传递到相同的目的地.如下: 这里A--X 和 ...
- iOS 网络编程:NSURLSession
NSURLSession类和相关的类提供很多API来下载HTTP的内容.这些API提供多种delegate协议来支持验证和执行后台下载任务. 1 URL Session 设计概念 Session中的任 ...
- radioButton的简单使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- Java并发——同步工具类
CountDownLatch 同步倒数计数器 CountDownLatch是一个同步倒数计数器.CountDownLatch允许一个或多个线程等待其他线程完成操作. CountDownLatch对象 ...
- CDOJ-10(栈的应用)
In Galgame We Trust Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Othe ...
- HDU-1052(贪心策略)
Tian Ji -- The Horse Racing Problem Description Here is a famous story in Chinese history. "Tha ...