ASP.NET Core 中的区域Areas in ASP.NET Core

本文内容

作者:Dhananjay KumarRick Anderson

区域是一种 ASP.NET 功能,用于将相关功能作为单独的组进行组织:

  • 用于路由的命名空间。
  • 视图和 Razor Pages 的文件夹结构。

使用区域通过为 controlleraction 或 Razor Page page 添加其他路由参数 area,创建用于路由目的的层次结构。

区域提供了一种将 ASP.NET Core Web 应用划分为更小的功能组的方法,每个功能组都有自己的一组 Razor Pages、控制器、视图和模型。区域实际上是应用内的结构。在 ASP.NET Core Web 项目中,Pages、模型、控制器和视图等逻辑组件保存在不同的文件夹中。ASP.NET Core 运行时使用命名约定来创建这些组件之间的关系。对于大型应用,将应用分区为独立的高级功能区域可能更有利。例如,具有多个业务单位(如结账、计费、搜索等)的电子商务应用。每个单位都有自己的区域,以包含视图、控制器、Razor Pages 和模型。

如果发生以下情况,请考虑在项目中使用区域:

  • 应用由可以进行逻辑分隔的多个高级功能组件组成。
  • 想对应用进行分区,以便可以独立处理每个功能区域。

查看或下载示例代码如何下载)。下载示例提供了用于测试区域的基本应用。

如果使用 Razor Pages,请参阅本文档中的使用 Razor Pages 的区域

带视图的控制器区域Areas for controllers with views

使用区域、控制器和视图的典型 ASP.NET Core Web 应用包含以下内容:

  1. [Area("Products")]
  2. public class ManageController : Controller
  3. {
  1. app.UseEndpoints(endpoints =>
  2. {
  3. endpoints.MapControllerRoute(
  4. name: "MyArea",
  5. pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  6. endpoints.MapControllerRoute(
  7. name: "default",
  8. pattern: "{controller=Home}/{action=Index}/{id?}");
  9. });

区域文件夹结构Area folder structure

请考虑具有两个逻辑组(产品和服务)的应用。使用区域,文件夹结构类似于以下内容:

  • 项目名称
    • Areas
      • Products
        • Controllers
          • HomeController.cs
          • ManageController.cs
        • Views
          • Home
            • Index.cshtml
          • Manage
            • Index.cshtml
            • About.cshtml
      • Services
        • Controllers
          • HomeController.cs
        • 视图
          • Home
            • Index.cshtml

虽然前面的布局是使用区域时的典型布局,但只需要视图文件即可使用此文件夹结构。视图发现按以下顺序搜索匹配的区域视图文件:

  1. /Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
  2. /Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
  3. /Views/Shared/<Action-Name>.cshtml
  4. /Pages/Shared/<Action-Name>.cshtml

将控制器与区域关联Associate the controller with an Area

使用[区域]属性指定区域控制器:

  1. using Microsoft.AspNetCore.Mvc;
  2. namespace MVCareas.Areas.Products.Controllers
  3. {
  4. [Area("Products")]
  5. public class ManageController : Controller
  6. {
  7. public IActionResult Index()
  8. {
  9. ViewData["routeInfo"] = ControllerContext.ToCtxString();
  10. return View();
  11. }
  12. public IActionResult About()
  13. {
  14. ViewData["routeInfo"] = ControllerContext.ToCtxString();
  15. return View();
  16. }
  17. }
  18. }

添加区域路由Add Area route

区域路由通常使用传统路由,而不是属性路由传统路由依赖于顺序。一般情况下,具有区域的路由应放在路由表中靠前的位置,因为它们比没有区域的路由更特定。

如果所有区域的 url 空间一致,则 {area:…} 可用作路由模板中的令牌:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Home/Error");
  10. app.UseHsts();
  11. }
  12. app.UseHttpsRedirection();
  13. app.UseStaticFiles();
  14. app.UseRouting();
  15. app.UseAuthorization();
  16. app.UseEndpoints(endpoints =>
  17. {
  18. endpoints.MapControllerRoute(
  19. name: "MyArea",
  20. pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  21. endpoints.MapControllerRoute(
  22. name: "default",
  23. pattern: "{controller=Home}/{action=Index}/{id?}");
  24. });
  25. }

在前面的代码中,exists 应用了路由必须与区域匹配的约束。使用 MapControllerRoute{area:…}

  • 是将路由添加到区域的最不复杂的机制。
  • 匹配具有 [Area("Area name")] 属性的所有控制器。

以下代码使用 MapAreaControllerRoute 创建两个命名区域路由:

  1. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Home/Error");
  10. app.UseHsts();
  11. }
  12. app.UseHttpsRedirection();
  13. app.UseStaticFiles();
  14. app.UseRouting();
  15. app.UseAuthorization();
  16. app.UseEndpoints(endpoints =>
  17. {
  18. endpoints.MapAreaControllerRoute(
  19. name: "MyAreaProducts",
  20. areaName: "Products",
  21. pattern: "Products/{controller=Home}/{action=Index}/{id?}");
  22. endpoints.MapAreaControllerRoute(
  23. name: "MyAreaServices",
  24. areaName: "Services",
  25. pattern: "Services/{controller=Home}/{action=Index}/{id?}");
  26. endpoints.MapControllerRoute(
  27. name: "default",
  28. pattern: "{controller=Home}/{action=Index}/{id?}");
  29. });
  30. }

有关详细信息,请参阅区域路由

MVC 区域的链接生成Link generation with MVC areas

示例下载中的以下代码显示指定区域的链接生成:

  1. <li>Anchor Tag Helper links</li>
  2. <ul>
  3. <li>
  4. <a asp-area="Products" asp-controller="Home" asp-action="About">
  5. Products/Home/About
  6. </a>
  7. </li>
  8. <li>
  9. <a asp-area="Services" asp-controller="Home" asp-action="About">
  10. Services About
  11. </a>
  12. </li>
  13. <li>
  14. <a asp-area="" asp-controller="Home" asp-action="About">
  15. /Home/About
  16. </a>
  17. </li>
  18. </ul>
  19. <li>Html.ActionLink generated links</li>
  20. <ul>
  21. <li>
  22. @Html.ActionLink("Product/Manage/About", "About", "Manage",
  23. new { area = "Products" })
  24. </li>
  25. </ul>
  26. <li>Url.Action generated links</li>
  27. <ul>
  28. <li>
  29. <a href='@Url.Action("About", "Manage", new { area = "Products" })'>
  30. Products/Manage/About
  31. </a>
  32. </li>
  33. </ul>

示例下载包含部分视图,其中包含:

  • 前面的链接。
  • 与前面的链接相似,但未指定 area

布局文件中引用部分视图,因此应用中的每个页面都显示生成的链接。在未指定区域的情况下生成的链接仅在从同一区域和控制器中的页面引用时才有效。

如果未指定区域或控制器,路由取决于环境值。当前请求的当前路由值被视为链接生成的环境值。在许多情况下,对于示例应用程序,使用环境值时,将生成带有未指定区域的标记的错误链接。

有关详细信息,请参阅路由到控制器操作

使用 _ViewStart.cshtml 文件的共享区域布局Shared layout for Areas using the _ViewStart.cshtml file

若要为整个应用共享公共布局,请在应用程序根文件夹中保留 _ViewStart。有关详细信息,请参阅ASP.NET Core 中的布局

应用程序根文件夹Application root folder

应用程序根文件夹是包含 ASP.NET Core 模板创建的 web 应用中的Startup.cs的文件夹。

_ViewImports.cshtml_ViewImports.cshtml

对于 MVC, _ViewImports 的/Views//Pages/_ViewImports Razor Pages 不会导入到区域中的视图。使用以下方法之一来提供所有视图的视图导入:

  • ViewImports_添加到应用程序根文件夹。应用程序根文件夹中的 ViewImports_将应用到应用中的所有视图。
  • _ViewImports的文件复制到 "区域" 下的相应视图文件夹中。

_ViewImports 的 cshtml文件通常包含标记帮助程序导入、@using@inject 语句。有关详细信息,请参阅导入共享指令

更改存储视图的默认区域文件夹Change default area folder where views are stored

以下代码将默认的区域文件夹从 "Areas" 改为"MyAreas"

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.Configure<RazorViewEngineOptions>(options =>
  4. {
  5. options.AreaViewLocationFormats.Clear();
  6. options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
  7. options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
  8. options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
  9. });
  10. services.AddControllersWithViews();
  11. }

使用 Razor Pages 的区域Areas with Razor Pages

具有 Razor Pages 的区域需要应用根目录中的 Areas/<area name>/Pages 文件夹。以下文件夹结构用于示例应用

  • 项目名称
    • Areas
      • Products
        • Pages
          • _ViewImports
          • About
          • Index
      • Services
        • Pages
          • Manage
            • About
            • Index

Razor Pages 和区域的链接生成Link generation with Razor Pages and areas

示例下载中的以下代码显示指定区域(例如 asp-area="Products")的链接生成:

  1. <li>Anchor Tag Helper links</li>
  2. <ul>
  3. <li>
  4. <a asp-area="Products" asp-page="/About">
  5. Products/About
  6. </a>
  7. </li>
  8. <li>
  9. <a asp-area="Services" asp-page="/Manage/About">
  10. Services/Manage/About
  11. </a>
  12. </li>
  13. <li>
  14. <a asp-area="" asp-page="/About">
  15. /About
  16. </a>
  17. </li>
  18. </ul>
  19. <li>Url.Page generated links</li>
  20. <ul>
  21. <li>
  22. <a href='@Url.Page("/Manage/About", new { area = "Services" })'>
  23. Services/Manage/About
  24. </a>
  25. </li>
  26. <li>
  27. <a href='@Url.Page("/About", new { area = "Products" })'>
  28. Products/About
  29. </a>
  30. </li>
  31. </ul>

示例下载包含部分视图,该视图包含以前的链接和相同的链接(未指定区域)。布局文件中引用部分视图,因此应用中的每个页面都显示生成的链接。在未指定区域的情况下生成的链接仅在从同一区域中的页引用时才有效。

如果未指定区域,路由取决于环境值。当前请求的当前路由值被视为链接生成的环境值。在许多情况下,对于示例应用,使用环境值会生成错误的链接。例如,考虑从下面的代码生成的链接:

  1. <li>
  2. <a asp-page="/Manage/About">
  3. Services/Manage/About
  4. </a>
  5. </li>
  6. <li>
  7. <a asp-page="/About">
  8. /About
  9. </a>
  10. </li>

对于上述代码:

  • 只有当最后一个请求是针对 Services 区域的页时,从 <a asp-page="/Manage/About"> 生成的链接才是正确的。例如 /Services/Manage//Services/Manage/Index/Services/Manage/About
  • 只有当最后一个请求是针对 /Home 中的页时,从 <a asp-page="/About"> 生成的链接才是正确的。
  • 代码摘自示例下载

使用 _ViewImports 文件导入命名空间和标记帮助程序Import namespace and Tag Helpers with _ViewImports file

可向每个区域“页面”文件夹添加一个 _ViewImports.cshtml 文件,以将命名空间和标记帮助器导入到该文件夹的每个 Razor 页面中。

请考虑使用示例代码的“服务”区域,它不包含 _ViewImports.cshtml 文件。以下标记显示 /Services/Manage/About Razor Page:

  1. @page
  2. @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
  3. @model RPareas.Areas.Services.Pages.Manage.AboutModel
  4. @{
  5. ViewData["Title"] = "Srv Mng About";
  6. }
  7. <a asp-area="Products" asp-page="/Index">
  8. Products/Index
  9. </a>

在前面的标记中:

  • 必须使用完全限定的域名来指定模型 (@model RPareas.Areas.Services.Pages.Manage.AboutModel)。
  • 标记帮助程序@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 启动

在示例下载中,“产品”区域包含下列 _ViewImports.cshtml 文件:

  1. @namespace RPareas.Areas.Products.Pages
  2. @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

以下标记显示 /Products/About Razor Page:

  1. @page
  2. @model AboutModel
  3. @{
  4. ViewData["Title"] = "Prod About";
  5. }

在前面的文件中,命名空间和 @addTagHelper 指令通过 Areas/Products/Pages/_ViewImports.cshtml 文件导入到文件中。

有关详细信息,请参阅管理标记帮助程序范围导入共享指令

Razor Pages 区域的共享布局Shared layout for Razor Pages Areas

要共享整个应用的常用布局,请将 _ViewStart.cshtml 移动到应用程序根文件夹。

发布区域Publishing Areas

.csproj 文件中包含 <Project Sdk="Microsoft.NET.Sdk.Web"> 时,所有 .cshtml 文件以及 wwwroot 目录中的文件都将发布到输出中。

区域是 ASP.NET 功能,用于将相关功能以单独的名称空间(用于路由)和文件夹结构(用于视图)的形式组织到一个组中。使用区域通过为 controlleraction 或 Razor Page page 添加其他路由参数 area,创建用于路由目的的层次结构。

区域提供了一种将 ASP.NET Core Web 应用划分为更小的功能组的方法,每个功能组都有自己的一组 Razor Pages、控制器、视图和模型。区域实际上是应用内的结构。在 ASP.NET Core Web 项目中,Pages、模型、控制器和视图等逻辑组件保存在不同的文件夹中。ASP.NET Core 运行时使用命名约定来创建这些组件之间的关系。对于大型应用,将应用分区为独立的高级功能区域可能更有利。例如,具有多个业务单位(如结账、计费、搜索等)的电子商务应用。每个单位都有自己的区域,以包含视图、控制器、Razor Pages 和模型。

如果发生以下情况,请考虑在项目中使用区域:

  • 应用由可以进行逻辑分隔的多个高级功能组件组成。
  • 想对应用进行分区,以便可以独立处理每个功能区域。

查看或下载示例代码如何下载)。下载示例提供了用于测试区域的基本应用。

如果使用 Razor Pages,请参阅本文档中的使用 Razor Pages 的区域

带视图的控制器区域Areas for controllers with views

使用区域、控制器和视图的典型 ASP.NET Core Web 应用包含以下内容:

  1. [Area("Products")]
  2. public class ManageController : Controller
  3. {
  1. app.UseMvc(routes =>
  2. {
  3. routes.MapRoute(
  4. name: "MyArea",
  5. template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  6. routes.MapRoute(
  7. name: "default",
  8. template: "{controller=Home}/{action=Index}/{id?}");
  9. });

区域文件夹结构Area folder structure

请考虑具有两个逻辑组(产品和服务)的应用。使用区域,文件夹结构类似于以下内容:

  • 项目名称
    • Areas
      • Products
        • Controllers
          • HomeController.cs
          • ManageController.cs
        • Views
          • Home
            • Index.cshtml
          • Manage
            • Index.cshtml
            • About.cshtml
      • Services
        • Controllers
          • HomeController.cs
        • 视图
          • Home
            • Index.cshtml

虽然前面的布局是使用区域时的典型布局,但只需要视图文件即可使用此文件夹结构。视图发现按以下顺序搜索匹配的区域视图文件:

  1. /Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
  2. /Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
  3. /Views/Shared/<Action-Name>.cshtml
  4. /Pages/Shared/<Action-Name>.cshtml

将控制器与区域关联Associate the controller with an Area

使用[区域]属性指定区域控制器:

  1. using Microsoft.AspNetCore.Mvc;
  2. namespace MVCareas.Areas.Products.Controllers
  3. {
  4. [Area("Products")]
  5. public class ManageController : Controller
  6. {
  7. public IActionResult Index()
  8. {
  9. return View();
  10. }
  11. public IActionResult About()
  12. {
  13. return View();
  14. }
  15. }
  16. }

添加区域路由Add Area route

区域路由通常使用传统路由,而不使用属性路由。传统路由依赖于顺序。一般情况下,具有区域的路由应放在路由表中靠前的位置,因为它们比没有区域的路由更特定。

如果所有区域的 url 空间一致,则 {area:…} 可用作路由模板中的令牌:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Home/Error");
  10. app.UseHsts();
  11. }
  12. app.UseHttpsRedirection();
  13. app.UseStaticFiles();
  14. app.UseMvc(routes =>
  15. {
  16. routes.MapRoute(
  17. name: "MyArea",
  18. template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
  19. routes.MapRoute(
  20. name: "default",
  21. template: "{controller=Home}/{action=Index}/{id?}");
  22. });
  23. }

在前面的代码中,exists 应用了路由必须与区域匹配的约束。使用 {area:…} 是将路由添加到区域的最简单的机制。

以下代码使用 MapAreaRoute 创建两个命名区域路由:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Home/Error");
  10. app.UseHsts();
  11. }
  12. app.UseHttpsRedirection();
  13. app.UseStaticFiles();
  14. app.UseMvc(routes =>
  15. {
  16. routes.MapAreaRoute(
  17. name: "MyAreaProducts",
  18. areaName:"Products",
  19. template: "Products/{controller=Home}/{action=Index}/{id?}");
  20. routes.MapAreaRoute(
  21. name: "MyAreaServices",
  22. areaName: "Services",
  23. template: "Services/{controller=Home}/{action=Index}/{id?}");
  24. routes.MapRoute(
  25. name: "default",
  26. template: "{controller=Home}/{action=Index}/{id?}");
  27. });
  28. }

MapAreaRoute 与 ASP.NET Core 2.2 配合使用时,请参阅此 GitHub 问题

有关详细信息,请参阅区域路由

MVC 区域的链接生成Link generation with MVC areas

示例下载中的以下代码显示指定区域的链接生成:

  1. <li>Anchor Tag Helper links</li>
  2. <ul>
  3. <li>
  4. <a asp-area="Products" asp-controller="Home" asp-action="About">
  5. Products/Home/About
  6. </a>
  7. </li>
  8. <li>
  9. <a asp-area="Services" asp-controller="Home" asp-action="About">
  10. Services About
  11. </a>
  12. </li>
  13. <li>
  14. <a asp-area="" asp-controller="Home" asp-action="About">
  15. /Home/About
  16. </a>
  17. </li>
  18. </ul>
  19. <li>Html.ActionLink generated links</li>
  20. <ul>
  21. <li>
  22. @Html.ActionLink("Product/Manage/About", "About", "Manage",
  23. new { area = "Products" })
  24. </li>
  25. </ul>
  26. <li>Url.Action generated links</li>
  27. <ul>
  28. <li>
  29. <a href='@Url.Action("About", "Manage", new { area = "Products" })'>
  30. Products/Manage/About
  31. </a>
  32. </li>
  33. </ul>

使用上述代码生成的链接在应用的任何位置都有效。

示例下载包含部分视图,该视图包含以前的链接和相同的链接(未指定区域)。布局文件中引用部分视图,因此应用中的每个页面都显示生成的链接。在未指定区域的情况下生成的链接仅在从同一区域和控制器中的页面引用时才有效。

如果未指定区域或控制器,路由取决于环境值。当前请求的当前路由值被视为链接生成的环境值。在许多情况下,对于示例应用,使用环境值会生成错误的链接。

有关详细信息,请参阅路由到控制器操作

使用 _ViewStart.cshtml 文件的共享区域布局Shared layout for Areas using the _ViewStart.cshtml file

要共享整个应用的常用布局,请将 _ViewStart.cshtml 移动到应用程序根文件夹。

_ViewImports.cshtml_ViewImports.cshtml

在其标准位置,/Views/_ViewImports.cshtml 不适用于区域。若要在区域中使用常用的标记帮助程序@using@inject,确保将正确的 _ViewImports.cshtml 文件应用于区域视图如果希望所有视图都具有相同的行为,请将 /Views/_ViewImports.cshtml 迁移到应用程序根。

更改存储视图的默认区域文件夹Change default area folder where views are stored

以下代码将默认的区域文件夹从 "Areas" 改为"MyAreas"

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.Configure<RazorViewEngineOptions>(options =>
  4. {
  5. options.AreaViewLocationFormats.Clear();
  6. options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
  7. options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
  8. options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
  9. });
  10. services.AddMvc();
  11. }

使用 Razor Pages 的区域Areas with Razor Pages

具有 Razor Pages 的区域需要应用根目录中的 Areas/<area name>/Pages 文件夹。以下文件夹结构用于示例应用

  • 项目名称
    • Areas
      • Products
        • Pages
          • _ViewImports
          • About
          • Index
      • Services
        • Pages
          • Manage
            • About
            • Index

Razor Pages 和区域的链接生成Link generation with Razor Pages and areas

示例下载中的以下代码显示指定区域(例如 asp-area="Products")的链接生成:

  1. <li>Anchor Tag Helper links</li>
  2. <ul>
  3. <li>
  4. <a asp-area="Products" asp-page="/About">
  5. Products/About
  6. </a>
  7. </li>
  8. <li>
  9. <a asp-area="Services" asp-page="/Manage/About">
  10. Services/Manage/About
  11. </a>
  12. </li>
  13. <li>
  14. <a asp-area="" asp-page="/About">
  15. /About
  16. </a>
  17. </li>
  18. </ul>
  19. <li>Url.Page generated links</li>
  20. <ul>
  21. <li>
  22. <a href='@Url.Page("/Manage/About", new { area = "Services" })'>
  23. Services/Manage/About
  24. </a>
  25. </li>
  26. <li>
  27. <a href='@Url.Page("/About", new { area = "Products" })'>
  28. Products/About
  29. </a>
  30. </li>
  31. </ul>

使用上述代码生成的链接在应用的任何位置都有效。

示例下载包含部分视图,该视图包含以前的链接和相同的链接(未指定区域)。布局文件中引用部分视图,因此应用中的每个页面都显示生成的链接。在未指定区域的情况下生成的链接仅在从同一区域中的页引用时才有效。

如果未指定区域,路由取决于环境值。当前请求的当前路由值被视为链接生成的环境值。在许多情况下,对于示例应用,使用环境值会生成错误的链接。例如,考虑从下面的代码生成的链接:

  1. <li>
  2. <a asp-page="/Manage/About">
  3. Services/Manage/About
  4. </a>
  5. </li>
  6. <li>
  7. <a asp-page="/About">
  8. /About
  9. </a>
  10. </li>

对于上述代码:

  • 只有当最后一个请求是针对 Services 区域的页时,从 <a asp-page="/Manage/About"> 生成的链接才是正确的。例如 /Services/Manage//Services/Manage/Index/Services/Manage/About
  • 只有当最后一个请求是针对 /Home 中的页时,从 <a asp-page="/About"> 生成的链接才是正确的。
  • 代码摘自示例下载

使用 _ViewImports 文件导入命名空间和标记帮助程序Import namespace and Tag Helpers with _ViewImports file

可向每个区域“页面”文件夹添加一个 _ViewImports.cshtml 文件,以将命名空间和标记帮助器导入到该文件夹的每个 Razor 页面中。

请考虑使用示例代码的“服务”区域,它不包含 _ViewImports.cshtml 文件。以下标记显示 /Services/Manage/About Razor Page:

  1. @page
  2. @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
  3. @model RPareas.Areas.Services.Pages.Manage.AboutModel
  4. @{
  5. ViewData["Title"] = "Srv Mng About";
  6. }
  7. <h2>/Services/Manage/About</h2>
  8. <a asp-area="Products" asp-page="/Index">
  9. Products/Index
  10. </a>

在前面的标记中:

  • 必须使用完全限定的域名来指定模型 (@model RPareas.Areas.Services.Pages.Manage.AboutModel)。
  • 标记帮助程序@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 启动

在示例下载中,“产品”区域包含下列 _ViewImports.cshtml 文件:

  1. @namespace RPareas.Areas.Products.Pages
  2. @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

以下标记显示 /Products/About Razor Page:

  1. @page
  2. @model AboutModel
  3. @{
  4. ViewData["Title"] = "Prod About";
  5. }
  6. <h2>Products/About</h2>
  7. <a asp-area="Services" asp-page="/Manage/About">
  8. Services/Manage/About
  9. </a>

在前面的文件中,命名空间和 @addTagHelper 指令通过 Areas/Products/Pages/_ViewImports.cshtml 文件导入到文件中。

有关详细信息,请参阅管理标记帮助程序范围导入共享指令

Razor Pages 区域的共享布局Shared layout for Razor Pages Areas

要共享整个应用的常用布局,请将 _ViewStart.cshtml 移动到应用程序根文件夹。

发布区域Publishing Areas

.csproj 文件中包含 <Project Sdk="Microsoft.NET.Sdk.Web"> 时,所有 .cshtml 文件以及 wwwroot 目录中的文件都将发布到输出中。