Oblasti v ASP.NET Core
Dhananjay Kumar a Rick Anderson
Oblasti jsou funkce ASP.NET sloužící k uspořádání souvisejících funkcí do skupiny jako samostatné:
- Namespace pro směrování.
- Struktura složek pro zobrazení a Razor stránky
Použití oblastí vytvoří hierarchii pro účely směrování přidáním dalšího parametru trasy , area
do controller
a action
nebo Razor stránky page
.
Oblasti poskytují způsob, jak rozdělit webovou aplikaci ASP.NET Core do menších funkčních skupin, z nichž každá má vlastní sadu Razor stránek, kontrolerů, zobrazení a modelů. Oblast je v podstatě struktura uvnitř aplikace. Ve webovém projektu ASP.NET Core se logické komponenty, jako jsou Pages, Model, Controller a View, uchovávají v různých složkách. Modul runtime ASP.NET Core používá zásady vytváření názvů k vytvoření vztahu mezi těmito komponentami. U velké aplikace může být výhodné rozdělit aplikaci do samostatných oblastí funkčnosti vysoké úrovně. Například aplikace elektronického obchodování s několika obchodními jednotkami, jako je pokladna, fakturace a vyhledávání. Každá z těchto jednotek má vlastní oblast, která obsahuje zobrazení, kontrolery, Razor stránky a modely.
Zvažte použití oblastí v projektu v následujících případech:
- Aplikace je tvořená několika funkčními komponentami vysoké úrovně, které je možné logicky oddělit.
- Chcete rozdělit aplikaci tak, aby každá funkční oblast fungovala nezávisle na sobě.
Pokud používáte Razor stránky, přečtěte si téma Oblasti se stránkami Razor v tomto dokumentu.
Oblasti pro kontrolery se zobrazeními
Typická webová aplikace ASP.NET Core, která používá oblasti, kontrolery a zobrazení, obsahuje následující:
Struktura složek Oblasti.
Kontrolery s atributem
[Area]
pro přidružení kontroleru k oblasti:[Area("Products")] public class ManageController : Controller {
Trasa oblasti přidaná do
Program.cs
:var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "MyArea", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
Struktura složek oblasti
Představte si aplikaci, která má dvě logické skupiny, produkty a služby. Struktura složek by se při použití oblastí podobala následujícímu:
- Název projektu
- Oblasti
- Produkty
- Řadiče
- HomeController.cs
- ManageController.cs
- Pohledy
- Home
- Index.cshtml
- Spravovat
- Index.cshtml
- About.cshtml
- Home
- Řadiče
- Služby
- Řadiče
- HomeController.cs
- Pohledy
- Home
- Index.cshtml
- Home
- Řadiče
- Produkty
- Oblasti
Zatímco předchozí rozložení je typické při použití oblastí, k použití této struktury složek se vyžadují pouze soubory zobrazení. Zobrazení vyhledávání hledá odpovídající soubor zobrazení oblasti v následujícím pořadí:
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
/Pages/Shared/<Action-Name>.cshtml
Přidružení kontroleru k oblasti
Řadiče oblastí jsou označené atributem [Area]
:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Docs.Samples;
namespace MVCareas.Areas.Products.Controllers;
[Area("Products")]
public class ManageController : Controller
{
public IActionResult Index()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
public IActionResult About()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
}
Přidat trasu oblasti
Trasy oblastí obvykle používají konvenční směrování místo směrování atributů. Konvenční směrování je závislé na pořadí. Obecně platí, že trasy s oblastmi by měly být umístěny dříve v směrovací tabulce, protože jsou konkrétnější než trasy bez oblasti.
{area:...}
lze použít jako token v šablonách tras, pokud je prostor adres URL jednotný ve všech oblastech:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
V předchozím kódu použije omezení, exists
které musí trasa shodovat s oblastí. Použití s {area:...}
MapControllerRoute
:
- Je nejméně komplikovaný mechanismus přidávání směrování do oblastí.
- Odpovídá všem kontrolerům s atributem
[Area("Area name")]
.
Následující kód používá MapAreaControllerRoute k vytvoření dvou pojmenovaných tras oblasti:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapAreaControllerRoute(
name: "MyAreaProducts",
areaName: "Products",
pattern: "Products/{controller=Home}/{action=Index}/{id?}");
app.MapAreaControllerRoute(
name: "MyAreaServices",
areaName: "Services",
pattern: "Services/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Další informace naleznete v tématu Směrování oblasti.
Generování propojení s oblastmi MVC
Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí:
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-controller="Home" asp-action="About">
Products/Home/About
</a>
</li>
<li>
<a asp-area="Services" asp-controller="Home" asp-action="About">
Services About
</a>
</li>
<li>
<a asp-area="" asp-controller="Home" asp-action="About">
/Home/About
</a>
</li>
</ul>
<li>Html.ActionLink generated links</li>
<ul>
<li>
@Html.ActionLink("Product/Manage/About", "About", "Manage",
new { area = "Products" })
</li>
</ul>
<li>Url.Action generated links</li>
<ul>
<li>
<a href='@Url.Action("About", "Manage", new { area = "Products" })'>
Products/Manage/About
</a>
</li>
</ul>
Stažení ukázky zahrnuje částečné zobrazení , které obsahuje:
- Předchozí odkazy.
- Odkazy podobné předchozímu s výjimkou
area
nejsou zadány.
Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti a kontroleru.
Pokud není zadána oblast nebo kontroler, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy s kódem, který neurčuje oblast.
Další informace naleznete v tématu Směrování na akce kontroleru.
Sdílené rozložení oblastí pomocí souboru _ViewStart.cshtml
Pokud chcete sdílet společné rozložení pro celou aplikaci, ponechte soubor _ViewStart.cshtml v kořenové složce aplikace. Další informace najdete v tématu Rozložení v ASP.NET Core
Kořenová složka aplikace
Kořenová složka aplikace je složka obsahující Program.cs
soubor ve webové aplikaci vytvořené pomocí šablon ASP.NET Core.
_ViewImports.cshtml
/Views/_ViewImports.cshtml, pro MVC a /Pages/_ViewImports.cshtml pro Razor Stránky, se neimportuje do zobrazení v oblastech. Pomocí jednoho z následujících přístupů můžete zobrazit importy do všech zobrazení:
- Do kořenové složky aplikace přidejte soubor _ViewImports.cshtml. Soubor _ViewImports.cshtml v kořenové složce aplikace se použije pro všechna zobrazení v aplikaci.
- Zkopírujte soubor _ViewImports.cshtml do příslušné složky zobrazení v oblastech. Aplikace Pages vytvořená pomocí jednotlivých uživatelských účtů má například Razor soubor _ViewImports.cshtml v následujících složkách:
- /Areas//IdentityPages/_ViewImports.cshtml
- /Pages/_ViewImports.cshtml
Soubor _ViewImports.cshtml obvykle obsahuje importy @using
pomocných rutin značek a @inject
příkazy. Další informace naleznete v tématu Import sdílených direktiv.
Změna výchozí složky oblasti, ve které jsou uložená zobrazení
Následující kód změní výchozí složku oblasti z"Areas"
:"MyAreas"
using Microsoft.AspNetCore.Mvc.Razor;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Oblasti se stránkami Razor
Oblasti se stránkami Razor vyžadují Areas/<area name>/Pages
složku v kořenovém adresáři aplikace. V ukázkové aplikaci se používá následující struktura složek:
- Název projektu
- Oblasti
- Produkty
- Stránky
- _ViewImports
- Informace
- Index
- Stránky
- Služby
- Stránky
- Spravovat
- Informace
- Index
- Spravovat
- Stránky
- Produkty
- Oblasti
Generování propojení se stránkami a oblastmi Razor
Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí (například asp-area="Products"
):
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-page="/About">
Products/About
</a>
</li>
<li>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-area="" asp-page="/About">
/About
</a>
</li>
</ul>
<li>Url.Page generated links</li>
<ul>
<li>
<a href='@Url.Page("/Manage/About", new { area = "Services" })'>
Services/Manage/About
</a>
</li>
<li>
<a href='@Url.Page("/About", new { area = "Products" })'>
Products/About
</a>
</li>
</ul>
Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti.
Pokud oblast není zadána, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy. Představte si například odkazy vygenerované z následujícího kódu:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Pro předchozí kód:
- Odkaz vygenerovaný z
<a asp-page="/Manage/About">
je správný pouze v případě, že poslední žádost byla pro stránku vServices
oblasti. Například ,/Services/Manage/
,/Services/Manage/Index
nebo/Services/Manage/About
. - Odkaz vygenerovaný z
<a asp-page="/About">
je správný pouze v případě, že poslední požadavek byl pro stránku v/Home
. - Kód pochází z ukázkového stažení.
Import pomocných rutin oboru názvů a značek pomocí souboru _ViewImports
Do každé složky Stránky oblasti lze přidat soubor _ViewImports.cshtml, který naimportuje obor názvů a pomocné rutiny značek do každé Razor stránky ve složce.
Vezměte v úvahu oblast Služby ukázkového kódu, která neobsahuje soubor _ViewImports.cshtml . Následující kód ukazuje stránku /Services/Manage/AboutRazor:
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
ViewData["Title"] = "Srv Mng About";
}
<div>
ViewData["routeInfo"]: @ViewData["routeInfo"]
</div>
<a asp-area="Products" asp-page="/Index">
Products/Index
</a>
V předchozím kódu:
- Plně kvalifikovaný název třídy se musí použít k určení modelu (
@model RPareas.Areas.Services.Pages.Manage.AboutModel
). - Pomocné rutiny značek jsou povoleny
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
V ukázkovém stažení obsahuje oblast Products následující soubor _ViewImports.cshtml :
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Následující kód ukazuje stránku /Products/AboutRazor:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
V předchozím souboru se obor názvů a @addTagHelper
direktiva importují do souboru pomocí souboru Areas/Products/Pages/_ViewImports.cshtml .
Další informace naleznete v tématu Správa oboru pomocné rutiny značek a import sdílených direktiv.
Sdílené rozložení pro Razor oblasti stránek
Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte soubor _ViewStart.cshtml do kořenové složky aplikace.
Oblasti publikování
Všechny soubory a soubory *.cshtml v adresáři wwwroot se publikují do výstupu, pokud <Project Sdk="Microsoft.NET.Sdk.Web">
je součástí souboru *.csproj.
Přidání oblasti MVC pomocí sady Visual Studio
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte PŘIDAT > novou vygenerovanou položku a pak vyberte oblast MVC.
Další materiály
- Zobrazení nebo stažení vzorového kódu (postup stažení) Ukázka stahování poskytuje základní aplikaci pro testovací oblasti.
- Metody MyDisplayRouteInfo a ToCtxString poskytuje balíček NuGet Rick.Docs.Samples.RouteInfo. Tyto metody zobrazují informace o trasách
Controller
aRazor Page
.
Oblasti jsou funkce ASP.NET sloužící k uspořádání souvisejících funkcí do skupiny jako samostatné:
- Namespace pro směrování.
- Struktura složek pro zobrazení a Razor stránky
Použití oblastí vytvoří hierarchii pro účely směrování přidáním dalšího parametru trasy , area
do controller
a action
nebo Razor stránky page
.
Oblasti poskytují způsob, jak rozdělit webovou aplikaci ASP.NET Core do menších funkčních skupin, z nichž každá má vlastní sadu Razor stránek, kontrolerů, zobrazení a modelů. Oblast je v podstatě struktura uvnitř aplikace. Ve webovém projektu ASP.NET Core se logické komponenty, jako jsou Pages, Model, Controller a View, uchovávají v různých složkách. Modul runtime ASP.NET Core používá zásady vytváření názvů k vytvoření vztahu mezi těmito komponentami. U velké aplikace může být výhodné rozdělit aplikaci do samostatných oblastí funkčnosti vysoké úrovně. Například aplikace elektronického obchodování s několika obchodními jednotkami, jako je pokladna, fakturace a vyhledávání. Každá z těchto jednotek má vlastní oblast, která obsahuje zobrazení, kontrolery, Razor stránky a modely.
Zvažte použití oblastí v projektu v následujících případech:
- Aplikace je tvořená několika funkčními komponentami vysoké úrovně, které je možné logicky oddělit.
- Chcete rozdělit aplikaci tak, aby každá funkční oblast fungovala nezávisle na sobě.
Zobrazení nebo stažení vzorového kódu (postup stažení) Ukázka stahování poskytuje základní aplikaci pro testovací oblasti.
Pokud používáte Razor stránky, přečtěte si téma Oblasti se stránkami Razor v tomto dokumentu.
Oblasti pro kontrolery se zobrazeními
Typická webová aplikace ASP.NET Core, která používá oblasti, kontrolery a zobrazení, obsahuje následující:
Struktura složek Oblasti.
Kontrolery s atributem
[Area]
pro přidružení kontroleru k oblasti:[Area("Products")] public class ManageController : Controller {
Trasa oblasti přidaná ke spuštění:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "MyArea", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
Struktura složek oblasti
Představte si aplikaci, která má dvě logické skupiny, produkty a služby. Struktura složek by se při použití oblastí podobala následujícímu:
- Název projektu
- Oblasti
- Produkty
- Řadiče
- HomeController.cs
- ManageController.cs
- Pohledy
- Home
- Index.cshtml
- Spravovat
- Index.cshtml
- About.cshtml
- Home
- Řadiče
- Služby
- Řadiče
- HomeController.cs
- Pohledy
- Home
- Index.cshtml
- Home
- Řadiče
- Produkty
- Oblasti
Zatímco předchozí rozložení je typické při použití oblastí, k použití této struktury složek se vyžadují pouze soubory zobrazení. Zobrazení vyhledávání hledá odpovídající soubor zobrazení oblasti v následujícím pořadí:
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
/Pages/Shared/<Action-Name>.cshtml
Přidružení kontroleru k oblasti
Řadiče oblastí jsou označené atributem [Area] (Oblast):
using Microsoft.AspNetCore.Mvc;
using Microsoft.Docs.Samples;
namespace MVCareas.Areas.Products.Controllers
{
[Area("Products")]
public class ManageController : Controller
{
public IActionResult Index()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
public IActionResult About()
{
ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
return View();
}
}
}
Přidat trasu oblasti
Trasy oblastí obvykle používají konvenční směrování místo směrování atributů. Konvenční směrování je závislé na pořadí. Obecně platí, že trasy s oblastmi by měly být umístěny dříve v směrovací tabulce, protože jsou konkrétnější než trasy bez oblasti.
{area:...}
lze použít jako token v šablonách tras, pokud je prostor adres URL jednotný ve všech oblastech:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "MyArea",
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
V předchozím kódu použije omezení, exists
které musí trasa shodovat s oblastí. Použití s {area:...}
MapControllerRoute
:
- Je nejméně komplikovaný mechanismus přidávání směrování do oblastí.
- Odpovídá všem kontrolerům s atributem
[Area("Area name")]
.
Následující kód používá MapAreaControllerRoute k vytvoření dvou pojmenovaných tras oblasti:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapAreaControllerRoute(
name: "MyAreaProducts",
areaName: "Products",
pattern: "Products/{controller=Home}/{action=Index}/{id?}");
endpoints.MapAreaControllerRoute(
name: "MyAreaServices",
areaName: "Services",
pattern: "Services/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Další informace naleznete v tématu Směrování oblasti.
Generování propojení s oblastmi MVC
Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí:
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-controller="Home" asp-action="About">
Products/Home/About
</a>
</li>
<li>
<a asp-area="Services" asp-controller="Home" asp-action="About">
Services About
</a>
</li>
<li>
<a asp-area="" asp-controller="Home" asp-action="About">
/Home/About
</a>
</li>
</ul>
<li>Html.ActionLink generated links</li>
<ul>
<li>
@Html.ActionLink("Product/Manage/About", "About", "Manage",
new { area = "Products" })
</li>
</ul>
<li>Url.Action generated links</li>
<ul>
<li>
<a href='@Url.Action("About", "Manage", new { area = "Products" })'>
Products/Manage/About
</a>
</li>
</ul>
Stažení ukázky zahrnuje částečné zobrazení , které obsahuje:
- Předchozí odkazy.
- Odkazy podobné předchozímu s výjimkou
area
nejsou zadány.
Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti a kontroleru.
Pokud není zadána oblast nebo kontroler, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy s kódem, který neurčuje oblast.
Další informace naleznete v tématu Směrování na akce kontroleru.
Sdílené rozložení oblastí pomocí souboru _ViewStart.cshtml
Pokud chcete sdílet společné rozložení pro celou aplikaci, ponechte _ViewStart.cshtml
v kořenové složce aplikace. Další informace najdete v tématu Rozložení v ASP.NET Core
Kořenová složka aplikace
Kořenová složka aplikace je složka, která obsahuje Startup.cs
webovou aplikaci vytvořenou pomocí šablon ASP.NET Core.
_ViewImports.cshtml
/Views/_ViewImports.cshtml
, pro MVC a /Pages/_ViewImports.cshtml
pro Razor stránky se neimportuje do zobrazení v oblastech. Pomocí jednoho z následujících přístupů můžete zobrazit importy do všech zobrazení:
- Přidejte
_ViewImports.cshtml
ji do kořenové složky aplikace. V_ViewImports.cshtml
kořenové složce aplikace se použije pro všechna zobrazení v aplikaci. _ViewImports.cshtml
Zkopírujte soubor do příslušné složky zobrazení v oblastech.
Soubor _ViewImports.cshtml
obvykle obsahuje importy @using
pomocných rutin značek a @inject
příkazy. Další informace naleznete v tématu Import sdílených direktiv.
Změna výchozí složky oblasti, ve které jsou uložená zobrazení
Následující kód změní výchozí složku oblasti z"Areas"
:"MyAreas"
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
services.AddControllersWithViews();
}
Oblasti se stránkami Razor
Oblasti se stránkami Razor vyžadují Areas/<area name>/Pages
složku v kořenovém adresáři aplikace. V ukázkové aplikaci se používá následující struktura složek:
- Název projektu
- Oblasti
- Produkty
- Stránky
- _ViewImports
- Informace
- Index
- Stránky
- Služby
- Stránky
- Spravovat
- Informace
- Index
- Spravovat
- Stránky
- Produkty
- Oblasti
Generování propojení se stránkami a oblastmi Razor
Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí (například asp-area="Products"
):
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-page="/About">
Products/About
</a>
</li>
<li>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-area="" asp-page="/About">
/About
</a>
</li>
</ul>
<li>Url.Page generated links</li>
<ul>
<li>
<a href='@Url.Page("/Manage/About", new { area = "Services" })'>
Services/Manage/About
</a>
</li>
<li>
<a href='@Url.Page("/About", new { area = "Products" })'>
Products/About
</a>
</li>
</ul>
Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti.
Pokud oblast není zadána, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy. Představte si například odkazy vygenerované z následujícího kódu:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Pro předchozí kód:
- Odkaz vygenerovaný z
<a asp-page="/Manage/About">
je správný pouze v případě, že poslední žádost byla pro stránku vServices
oblasti. Například ,/Services/Manage/
,/Services/Manage/Index
nebo/Services/Manage/About
. - Odkaz vygenerovaný z
<a asp-page="/About">
je správný pouze v případě, že poslední požadavek byl pro stránku v/Home
. - Kód pochází z ukázkového stažení.
Import pomocných rutin oboru názvů a značek pomocí souboru _ViewImports
Do _ViewImports.cshtml
každé složky Stránky oblasti lze přidat soubor, který naimportuje obor názvů a pomocné rutiny značek do každé Razor stránky ve složce.
Vezměte v úvahu oblast Služby ukázkového kódu, která neobsahuje _ViewImports.cshtml
soubor. Následující kód ukazuje stránku /Services/Manage/AboutRazor:
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
ViewData["Title"] = "Srv Mng About";
}
<a asp-area="Products" asp-page="/Index">
Products/Index
</a>
V předchozím kódu:
- Plně kvalifikovaný název třídy se musí použít k určení modelu (
@model RPareas.Areas.Services.Pages.Manage.AboutModel
). - Pomocné rutiny značek jsou povoleny
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
V ukázkovém stažení obsahuje oblast Produkty následující _ViewImports.cshtml
soubor:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Následující kód ukazuje stránku /Products/AboutRazor:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
V předchozím souboru se obor názvů a @addTagHelper
direktiva importují do souboru souborem Areas/Products/Pages/_ViewImports.cshtml
.
Další informace naleznete v tématu Správa oboru pomocné rutiny značek a import sdílených direktiv.
Sdílené rozložení pro Razor oblasti stránek
Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte ji _ViewStart.cshtml
do kořenové složky aplikace.
Oblasti publikování
Všechny soubory a soubory *.cshtml v adresáři wwwroot se publikují do výstupu, pokud <Project Sdk="Microsoft.NET.Sdk.Web">
je součástí souboru *.csproj.
Přidání oblasti MVC pomocí sady Visual Studio
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte PŘIDAT > novou vygenerovanou položku a pak vyberte oblast MVC.
Oblasti jsou funkce ASP.NET sloužící k uspořádání souvisejících funkcí do skupiny jako samostatného oboru názvů (pro směrování) a strukturu složek (pro zobrazení). Použití oblastí vytvoří hierarchii pro účely směrování přidáním dalšího parametru trasy , area
do controller
a action
nebo Razor stránky page
.
Oblasti poskytují způsob, jak rozdělit webovou aplikaci ASP.NET Core do menších funkčních skupin, z nichž každá má vlastní sadu Razor stránek, kontrolerů, zobrazení a modelů. Oblast je v podstatě struktura uvnitř aplikace. Ve webovém projektu ASP.NET Core se logické komponenty, jako jsou Pages, Model, Controller a View, uchovávají v různých složkách. Modul runtime ASP.NET Core používá zásady vytváření názvů k vytvoření vztahu mezi těmito komponentami. U velké aplikace může být výhodné rozdělit aplikaci do samostatných oblastí funkčnosti vysoké úrovně. Například aplikace elektronického obchodování s několika obchodními jednotkami, jako je pokladna, fakturace a vyhledávání. Každá z těchto jednotek má vlastní oblast, která obsahuje zobrazení, kontrolery, Razor stránky a modely.
Zvažte použití oblastí v projektu v následujících případech:
- Aplikace je tvořená několika funkčními komponentami vysoké úrovně, které je možné logicky oddělit.
- Chcete rozdělit aplikaci tak, aby každá funkční oblast fungovala nezávisle na sobě.
Zobrazení nebo stažení vzorového kódu (postup stažení) Ukázka stahování poskytuje základní aplikaci pro testovací oblasti.
Pokud používáte Razor stránky, přečtěte si téma Oblasti se stránkami Razor v tomto dokumentu.
Oblasti pro kontrolery se zobrazeními
Typická webová aplikace ASP.NET Core, která používá oblasti, kontrolery a zobrazení, obsahuje následující:
Struktura složek Oblasti.
Kontrolery s atributem
[Area]
pro přidružení kontroleru k oblasti:[Area("Products")] public class ManageController : Controller {
Trasa oblasti přidaná ke spuštění:
app.UseMvc(routes => { routes.MapRoute( name: "MyArea", template: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
Struktura složek oblasti
Představte si aplikaci, která má dvě logické skupiny, produkty a služby. Struktura složek by se při použití oblastí podobala následujícímu:
- Název projektu
- Oblasti
- Produkty
- Řadiče
- HomeController.cs
- ManageController.cs
- Pohledy
- Home
- Index.cshtml
- Spravovat
- Index.cshtml
- About.cshtml
- Home
- Řadiče
- Služby
- Řadiče
- HomeController.cs
- Pohledy
- Home
- Index.cshtml
- Home
- Řadiče
- Produkty
- Oblasti
Zatímco předchozí rozložení je typické při použití oblastí, k použití této struktury složek se vyžadují pouze soubory zobrazení. Zobrazení vyhledávání hledá odpovídající soubor zobrazení oblasti v následujícím pořadí:
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
/Pages/Shared/<Action-Name>.cshtml
Přidružení kontroleru k oblasti
Řadiče oblastí jsou označené atributem [Area] (Oblast):
using Microsoft.AspNetCore.Mvc;
namespace MVCareas.Areas.Products.Controllers
{
[Area("Products")]
public class ManageController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult About()
{
return View();
}
}
}
Přidat trasu oblasti
Trasy oblastí obvykle používají konvenční směrování místo směrování atributů. Konvenční směrování je závislé na pořadí. Obecně platí, že trasy s oblastmi by měly být umístěny dříve v směrovací tabulce, protože jsou konkrétnější než trasy bez oblasti.
{area:...}
lze použít jako token v šablonách tras, pokud je prostor adres URL jednotný ve všech oblastech:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "MyArea",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
V předchozím kódu použije omezení, exists
které musí trasa shodovat s oblastí. Použití {area:...}
je nejméně komplikovaný mechanismus přidávání směrování do oblastí.
Následující kód používá MapAreaRoute k vytvoření dvou pojmenovaných tras oblasti:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapAreaRoute(
name: "MyAreaProducts",
areaName:"Products",
template: "Products/{controller=Home}/{action=Index}/{id?}");
routes.MapAreaRoute(
name: "MyAreaServices",
areaName: "Services",
template: "Services/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Pokud používáte s MapAreaRoute
ASP.NET Core 2.2, podívejte se na tento problém na GitHubu.
Další informace naleznete v tématu Směrování oblasti.
Generování propojení s oblastmi MVC
Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí:
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-controller="Home" asp-action="About">
Products/Home/About
</a>
</li>
<li>
<a asp-area="Services" asp-controller="Home" asp-action="About">
Services About
</a>
</li>
<li>
<a asp-area="" asp-controller="Home" asp-action="About">
/Home/About
</a>
</li>
</ul>
<li>Html.ActionLink generated links</li>
<ul>
<li>
@Html.ActionLink("Product/Manage/About", "About", "Manage",
new { area = "Products" })
</li>
</ul>
<li>Url.Action generated links</li>
<ul>
<li>
<a href='@Url.Action("About", "Manage", new { area = "Products" })'>
Products/Manage/About
</a>
</li>
</ul>
Odkazy vygenerované s předchozím kódem jsou platné kdekoli v aplikaci.
Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti a kontroleru.
Pokud není zadána oblast nebo kontroler, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy.
Další informace naleznete v tématu Směrování na akce kontroleru.
Sdílené rozložení oblastí pomocí souboru _ViewStart.cshtml
Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte ji _ViewStart.cshtml
do kořenové složky aplikace.
_ViewImports.cshtml
Ve standardním umístění /Views/_ViewImports.cshtml
se nevztahuje na oblasti. Pokud chcete použít běžné pomocné rutiny @using
značek nebo @inject
v oblasti, ujistěte se, že se pro zobrazení oblasti použije správný _ViewImports.cshtml
soubor. Pokud chcete stejné chování ve všech zobrazeních, přejděte /Views/_ViewImports.cshtml
do kořenového adresáře aplikace.
Změna výchozí složky oblasti, ve které jsou uložená zobrazení
Následující kód změní výchozí složku oblasti z"Areas"
:"MyAreas"
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
services.AddMvc();
}
Oblasti se stránkami Razor
Oblasti se stránkami Razor vyžadují Areas/<area name>/Pages
složku v kořenovém adresáři aplikace. V ukázkové aplikaci se používá následující struktura složek:
- Název projektu
- Oblasti
- Produkty
- Stránky
- _ViewImports
- Informace
- Index
- Stránky
- Služby
- Stránky
- Spravovat
- Informace
- Index
- Spravovat
- Stránky
- Produkty
- Oblasti
Generování propojení se stránkami a oblastmi Razor
Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí (například asp-area="Products"
):
<li>Anchor Tag Helper links</li>
<ul>
<li>
<a asp-area="Products" asp-page="/About">
Products/About
</a>
</li>
<li>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-area="" asp-page="/About">
/About
</a>
</li>
</ul>
<li>Url.Page generated links</li>
<ul>
<li>
<a href='@Url.Page("/Manage/About", new { area = "Services" })'>
Services/Manage/About
</a>
</li>
<li>
<a href='@Url.Page("/About", new { area = "Products" })'>
Products/About
</a>
</li>
</ul>
Odkazy vygenerované s předchozím kódem jsou platné kdekoli v aplikaci.
Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti.
Pokud oblast není zadána, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy. Představte si například odkazy vygenerované z následujícího kódu:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Pro předchozí kód:
- Odkaz vygenerovaný z
<a asp-page="/Manage/About">
je správný pouze v případě, že poslední žádost byla pro stránku vServices
oblasti. Například ,/Services/Manage/
,/Services/Manage/Index
nebo/Services/Manage/About
. - Odkaz vygenerovaný z
<a asp-page="/About">
je správný pouze v případě, že poslední požadavek byl pro stránku v/Home
. - Kód pochází z ukázkového stažení.
Import pomocných rutin oboru názvů a značek pomocí souboru _ViewImports
Do _ViewImports.cshtml
každé složky Stránky oblasti lze přidat soubor, který naimportuje obor názvů a pomocné rutiny značek do každé Razor stránky ve složce.
Vezměte v úvahu oblast Služby ukázkového kódu, která neobsahuje _ViewImports.cshtml
soubor. Následující kód ukazuje stránku /Services/Manage/AboutRazor:
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
ViewData["Title"] = "Srv Mng About";
}
<h2>/Services/Manage/About</h2>
<a asp-area="Products" asp-page="/Index">
Products/Index
</a>
V předchozím kódu:
- Plně kvalifikovaný název domény se musí použít k určení modelu (
@model RPareas.Areas.Services.Pages.Manage.AboutModel
). - Pomocné rutiny značek jsou povoleny
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
V ukázkovém stažení obsahuje oblast Produkty následující _ViewImports.cshtml
soubor:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Následující kód ukazuje stránku /Products/AboutRazor:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
<h2>Products/About</h2>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
V předchozím souboru se obor názvů a @addTagHelper
direktiva importují do souboru souborem Areas/Products/Pages/_ViewImports.cshtml
.
Další informace naleznete v tématu Správa oboru pomocné rutiny značek a import sdílených direktiv.
Sdílené rozložení pro Razor oblasti stránek
Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte ji _ViewStart.cshtml
do kořenové složky aplikace.
Oblasti publikování
Všechny soubory a soubory *.cshtml v adresáři wwwroot se publikují do výstupu, pokud <Project Sdk="Microsoft.NET.Sdk.Web">
je součástí souboru *.csproj.