Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Door Dhananjay Kumar en Rick Anderson
Gebieden zijn een ASP.NET functie die wordt gebruikt voor het organiseren van gerelateerde functionaliteit in een groep als afzonderlijke:
- Naamruimte voor routering.
- Mapstructuur voor weergaven en Razor pagina's.
Door gebieden te gebruiken, wordt een hiërarchie gemaakt voor routering door een andere routeparameter toe area
te voegen aan controller
en action
of een Razor pagina page
.
Gebieden bieden een manier om een ASP.NET Core-web-app te partitioneren in kleinere functionele groepen, elk met een eigen set Razor pagina's, controllers, weergaven en modellen. Een gebied is effectief een structuur binnen een app. In een ASP.NET Core-webproject worden logische onderdelen zoals Pagina's, Model, Controller en Weergave bewaard in verschillende mappen. De ASP.NET Core-runtime maakt gebruik van naamconventies om de relatie tussen deze onderdelen te maken. Voor een grote app kan het voordelig zijn om de app te partitioneren in afzonderlijke gebieden met functionaliteit op hoog niveau. Bijvoorbeeld een e-commerce-app met meerdere bedrijfseenheden, zoals afrekenen, facturering en zoeken. Elk van deze eenheden heeft een eigen gebied voor weergaven, controllers, Razor pagina's en modellen.
Overweeg gebieden in een project te gebruiken wanneer:
- De app is gemaakt van meerdere functionele onderdelen op hoog niveau die logisch kunnen worden gescheiden.
- U wilt de app partitioneren, zodat elk functioneel gebied onafhankelijk kan worden bewerkt.
Als u Razor Pagina's gebruikt, raadpleegt u Gebieden met Razor Pagina's in dit document.
Gebieden voor controllers met weergaven
Een typische ASP.NET Core-web-app met gebieden, controllers en weergaven bevat het volgende:
Controllers met het
[Area]
kenmerk om de controller te koppelen aan het gebied:[Area("Products")] public class ManageController : Controller {
De gebiedsroute toegevoegd aan
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();
Structuur van gebiedsmap
Overweeg een app met twee logische groepen, Producten en Services. Met behulp van gebieden zou de mapstructuur er ongeveer als volgt uitzien:
- Project name
- Areas
- Products
- Controllers
- HomeController.cs
- ManageController.cs
- Views
- Home
- Index.cshtml
- Manage
- Index.cshtml
- About.cshtml
- Home
- Controllers
- Services
- Controllers
- HomeController.cs
- Views
- Home
- Index.cshtml
- Home
- Controllers
- Products
- Areas
Hoewel de voorgaande indeling gebruikelijk is wanneer u Gebieden gebruikt, zijn alleen de weergavebestanden vereist om deze mapstructuur te gebruiken. Detectiezoekopdrachten weergeven naar een overeenkomend gebiedsweergavebestand in de volgende volgorde:
/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
De controller koppelen aan een gebied
Gebiedscontrollers worden aangewezen met het [Area]
kenmerk:
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();
}
}
Gebiedsroute toevoegen
Gebiedsroutes gebruiken doorgaans conventionele routering in plaats van kenmerkroutering. Conventionele routering is orderafhankelijk. Over het algemeen moeten routes met gebieden eerder in de routetabel worden geplaatst, omdat ze specifieker zijn dan routes zonder een gebied.
{area:...}
kan worden gebruikt als een token in routesjablonen als de URL-ruimte uniform is voor alle gebieden:
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();
In de voorgaande code exists
past u een beperking toe die de route moet overeenkomen met een gebied. Gebruiken {area:...}
met MapControllerRoute
:
- Is het minst gecompliceerde mechanisme voor het toevoegen van routering aan gebieden.
- Komt overeen met alle controllers met het
[Area("Area name")]
kenmerk.
De volgende code gebruikt MapAreaControllerRoute om twee benoemde gebiedenroutes te maken.
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();
Zie Gebiedsroutering voor meer informatie.
Generatie van koppeling met MVC-gebieden
De volgende code uit de voorbeelddownload toont het genereren van koppelingen met het opgegeven gebied:
<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>
De voorbeelddownload bevat een gedeeltelijke weergave die het volgende bevat:
- De voorgaande koppelingen.
- Koppelingen die vergelijkbaar zijn met de voorgaande, behalve dat
area
niet is gespecificeerd.
Er wordt in het indelingsbestand naar de gedeeltelijke weergave verwezen, zodat op elke pagina in de app de gegenereerde koppelingen worden weergegeven. De koppelingen die worden gegenereerd zonder het gebied op te geven, zijn alleen geldig wanneer naar een pagina in hetzelfde gebied en dezelfde controller wordt verwezen.
Wanneer het gebied of de controller niet is opgegeven, is routering afhankelijk van de omgevingswaarden . De huidige routewaarden van de huidige aanvraag worden beschouwd als omgevingswaarden voor het genereren van koppelingen. In veel gevallen voor de voorbeeldapp leidt het gebruik van omringende waarden tot incorrecte koppelingen met de opmaak die het gebied niet specificeert.
Zie Routering naar controlleracties voor meer informatie.
Gedeelde indeling voor gebieden met behulp van het bestand _ViewStart.cshtml
Als u een algemene indeling voor de hele app wilt delen, houdt u de _ViewStart.cshtml in de hoofdmap van de toepassing. Zie Indeling in ASP.NET Core voor meer informatie
Hoofdmap van toepassing
De hoofdmap van de toepassing is de map met het Program.cs
bestand in een web-app die is gemaakt met de ASP.NET Core-sjablonen.
_ViewImports.cshtml
/Views/_ViewImports.cshtml, voor MVC, en /Pages/_ViewImports.cshtml voor Razor Pages worden niet geïmporteerd in gebiedsweergaven. Gebruik een van de volgende methoden om importbewerkingen voor alle weergaven weer te geven:
- Voeg _ViewImports.cshtml toe aan de hoofdmap van de toepassing. Een _ViewImports.cshtml in de hoofdmap van de toepassing geldt voor alle weergaven in de app.
- Kopieer het bestand _ViewImports.cshtml naar de juiste weergavemap onder gebieden. Een pagina-app die is gemaakt met afzonderlijke accounts heeft bijvoorbeeld Razor een bestand _ViewImports.cshtml in de volgende mappen:
- /Areas/Identity/Pages/_ViewImports.cshtml
- /Pages/_ViewImports.cshtml
Het bestand _ViewImports.cshtml bevat doorgaans Tag Helpers import, @using
en @inject
instructies. Zie Gedeelde richtlijnen importeren voor meer informatie.
Standaardgebiedmap wijzigen waarin weergaven worden opgeslagen
Met de volgende code wordt de standaardgebiedmap gewijzigd van "Areas"
in "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();
Gebieden die Razor pagina's hebben
Gebieden met Razor Pagina's vereisen een Areas/<area name>/Pages
map in de rootmap van de app. De volgende mapstructuur wordt gebruikt met de voorbeeld-app:
- Project name
- Areas
- Products
- Pages
- _ViewImports
- About
- Index
- Pages
- Services
- Pages
- Manage
- About
- Index
- Manage
- Pages
- Products
- Areas
Link generatie met Razor pagina's en gebieden
De volgende code van het voorbeelddownload toont het genereren van koppelingen met het opgegeven gebied (bijvoorbeeld 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>
De voorbeelddownload bevat een gedeeltelijke weergave met de voorgaande koppelingen en dezelfde koppelingen zonder het gebied op te geven. Er wordt in het indelingsbestand naar de gedeeltelijke weergave verwezen, zodat op elke pagina in de app de gegenereerde koppelingen worden weergegeven. De koppelingen die worden gegenereerd zonder het gebied op te geven, zijn alleen geldig wanneer naar een pagina in hetzelfde gebied wordt verwezen.
Wanneer het gebied niet is opgegeven, is routering afhankelijk van de omgevingswaarden . De huidige routewaarden van de huidige aanvraag worden beschouwd als omgevingswaarden voor het genereren van koppelingen. In veel gevallen voor de voorbeeld-app genereert het gebruik van de omgevingswaarden onjuiste koppelingen. Denk bijvoorbeeld aan de koppelingen die zijn gegenereerd op basis van de volgende code:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Voor de voorgaande code:
- De koppeling die is gegenereerd op basis van
<a asp-page="/Manage/About">
is alleen juist wanneer de laatste aanvraag voor een pagina inServices
het gebied was. Bijvoorbeeld/Services/Manage/
,/Services/Manage/Index
of/Services/Manage/About
. - De koppeling die is gegenereerd op basis van
<a asp-page="/About">
is alleen correct wanneer de laatste aanvraag voor een pagina in/Home
. - De code is afkomstig van de voorbeelddownload.
Naamruimte en Tag Helpers importeren met _ViewImports-bestand
Een _ViewImports.cshtml-bestand kan worden toegevoegd aan elke map Pagina's van het gebied om de naamruimte en Tag Helpers te importeren voor elke Razor pagina in de map.
Overweeg het gebied Services van de voorbeeldcode, die geen _ViewImports.cshtml-bestand bevat. Het volgende markering toont de /Services/Manage/AboutRazor pagina:
@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>
In de voorgaande opmaak:
- De volledig gekwalificeerde klassenaam moet worden gebruikt om het model (
@model RPareas.Areas.Services.Pages.Manage.AboutModel
) op te geven. -
Tag Helpers zijn ingeschakeld door
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
In het voorbeelddownload bevat het gebied Producten het volgende bestand _ViewImports.cshtml :
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
De volgende markup laat de /Products/AboutRazor pagina zien:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
In het voorgaande bestand wordt de namespace en @addTagHelper
instructie geïmporteerd in het bestand Gebieden/Producten/Pagina's/_ViewImports.cshtml.
Zie Het bereik tag-helper beheren en gedeelde richtlijnen importeren voor meer informatie.
Gedeelde indeling voor Razor paginagebieden
Als u een algemene indeling voor de hele app wilt delen, verplaatst u de _ViewStart.cshtml naar de hoofdmap van de toepassing.
Publishing Areas
Alle *.cshtml-bestanden en bestanden in de wwwroot-map worden naar de uitvoer gepubliceerd wanneer deze zijn opgenomen in het *.csproj-bestand.
MVC-gebied toevoegen met Visual Studio
Klik in Solution Explorer met de rechtermuisknop op het project en selecteer Nieuw scaffolded Item toevoegen >en selecteer vervolgens MVC-gebied.
Additional resources
- Voorbeeldcode bekijken of downloaden (hoe u kunt downloaden). Het downloadvoorbeeld biedt een eenvoudige app voor testgebieden.
-
MyDisplayRouteInfo en ToCtxString worden geleverd door het NuGet-pakket Rick.Docs.Samples.RouteInfo . De methodes geven route-informatie weer
Controller
enRazor Page
.
Gebieden zijn een ASP.NET functie die wordt gebruikt voor het organiseren van gerelateerde functionaliteit in een groep als afzonderlijke:
- Naamruimte voor routering.
- Mapstructuur voor weergaven en Razor pagina's.
Door gebieden te gebruiken, wordt een hiërarchie gemaakt voor routering door een andere routeparameter toe area
te voegen aan controller
en action
of een Razor pagina page
.
Gebieden bieden een manier om een ASP.NET Core-web-app te partitioneren in kleinere functionele groepen, elk met een eigen set Razor pagina's, controllers, weergaven en modellen. Een gebied is effectief een structuur binnen een app. In een ASP.NET Core-webproject worden logische onderdelen zoals Pagina's, Model, Controller en Weergave bewaard in verschillende mappen. De ASP.NET Core-runtime maakt gebruik van naamconventies om de relatie tussen deze onderdelen te maken. Voor een grote app kan het voordelig zijn om de app te partitioneren in afzonderlijke gebieden met functionaliteit op hoog niveau. Bijvoorbeeld een e-commerce-app met meerdere bedrijfseenheden, zoals afrekenen, facturering en zoeken. Elk van deze eenheden heeft een eigen gebied voor weergaven, controllers, Razor pagina's en modellen.
Overweeg gebieden in een project te gebruiken wanneer:
- De app is gemaakt van meerdere functionele onderdelen op hoog niveau die logisch kunnen worden gescheiden.
- U wilt de app partitioneren, zodat elk functioneel gebied onafhankelijk kan worden bewerkt.
Voorbeeldcode bekijken of downloaden (hoe u kunt downloaden). Het downloadvoorbeeld biedt een eenvoudige app voor testgebieden.
Als u Razor Pagina's gebruikt, raadpleegt u Gebieden met Razor Pagina's in dit document.
Gebieden voor controllers met weergaven
Een typische ASP.NET Core-web-app met gebieden, controllers en weergaven bevat het volgende:
Controllers met het
[Area]
kenmerk om de controller te koppelen aan het gebied:[Area("Products")] public class ManageController : Controller {
De gebiedsroute toegevoegd bij het opstarten:
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?}"); });
Structuur van gebiedsmap
Overweeg een app met twee logische groepen, Producten en Services. Met behulp van gebieden zou de mapstructuur er ongeveer als volgt uitzien:
- Project name
- Areas
- Products
- Controllers
- HomeController.cs
- ManageController.cs
- Views
- Home
- Index.cshtml
- Manage
- Index.cshtml
- About.cshtml
- Home
- Controllers
- Services
- Controllers
- HomeController.cs
- Views
- Home
- Index.cshtml
- Home
- Controllers
- Products
- Areas
Hoewel de voorgaande indeling gebruikelijk is wanneer u Gebieden gebruikt, zijn alleen de weergavebestanden vereist om deze mapstructuur te gebruiken. Detectiezoekopdrachten weergeven naar een overeenkomend gebiedsweergavebestand in de volgende volgorde:
/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
De controller koppelen aan een gebied
Gebiedscontrollers worden aangewezen met het kenmerk [Gebied] :
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();
}
}
}
Gebiedsroute toevoegen
Gebiedsroutes gebruiken doorgaans conventionele routering in plaats van kenmerkroutering. Conventionele routering is orderafhankelijk. Over het algemeen moeten routes met gebieden eerder in de routetabel worden geplaatst, omdat ze specifieker zijn dan routes zonder een gebied.
{area:...}
kan worden gebruikt als een token in routesjablonen als de URL-ruimte uniform is voor alle gebieden:
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?}");
});
}
In de voorgaande code exists
past u een beperking toe die de route moet overeenkomen met een gebied. Gebruiken {area:...}
met MapControllerRoute
:
- Is het minst gecompliceerde mechanisme voor het toevoegen van routering aan gebieden.
- Komt overeen met alle controllers met het
[Area("Area name")]
kenmerk.
De volgende code gebruikt MapAreaControllerRoute om twee benoemde gebiedenroutes te maken.
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?}");
});
}
Zie Gebiedsroutering voor meer informatie.
Generatie van koppeling met MVC-gebieden
De volgende code uit de voorbeelddownload toont het genereren van koppelingen met het opgegeven gebied:
<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>
De voorbeelddownload bevat een gedeeltelijke weergave die het volgende bevat:
- De voorgaande koppelingen.
- Koppelingen die vergelijkbaar zijn met de voorgaande, behalve dat
area
niet is gespecificeerd.
Er wordt in het indelingsbestand naar de gedeeltelijke weergave verwezen, zodat op elke pagina in de app de gegenereerde koppelingen worden weergegeven. De koppelingen die worden gegenereerd zonder het gebied op te geven, zijn alleen geldig wanneer naar een pagina in hetzelfde gebied en dezelfde controller wordt verwezen.
Wanneer het gebied of de controller niet is opgegeven, is routering afhankelijk van de omgevingswaarden . De huidige routewaarden van de huidige aanvraag worden beschouwd als omgevingswaarden voor het genereren van koppelingen. In veel gevallen voor de voorbeeldapp leidt het gebruik van omringende waarden tot incorrecte koppelingen met de opmaak die het gebied niet specificeert.
Zie Routering naar controlleracties voor meer informatie.
Gedeelde indeling voor gebieden met behulp van het bestand _ViewStart.cshtml
Als u een algemene indeling voor de hele app wilt delen, houdt u de _ViewStart.cshtml
map in de hoofdmap van de toepassing. Zie Indeling in ASP.NET Core voor meer informatie
Hoofdmap van toepassing
De hoofdmap van de toepassing is de map die Startup.cs
bevat in een web-app die is gemaakt met de ASP.NET Core-sjablonen.
_ViewImports.cshtml
/Views/_ViewImports.cshtml
, voor MVC en /Pages/_ViewImports.cshtml
voor Razor Pagina's, wordt niet geïmporteerd in weergaven in gebieden. Gebruik een van de volgende methoden om importbewerkingen voor alle weergaven weer te geven:
- Toevoegen
_ViewImports.cshtml
aan de hoofdmap van de toepassing. Een_ViewImports.cshtml
in de hoofdmap van de toepassing is van toepassing op alle weergaven in de app. - Kopieer het
_ViewImports.cshtml
bestand naar de juiste weergavemap onder gebieden.
Het _ViewImports.cshtml
bestand bevat doorgaans Tag Helpers-importen, @using
en @inject
instructies. Zie Gedeelde richtlijnen importeren voor meer informatie.
Standaardgebiedmap wijzigen waarin weergaven worden opgeslagen
Met de volgende code wordt de standaardgebiedmap gewijzigd van "Areas"
in "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();
}
Gebieden die Razor pagina's hebben
Gebieden met Razor Pagina's vereisen een Areas/<area name>/Pages
map in de rootmap van de app. De volgende mapstructuur wordt gebruikt met de voorbeeld-app:
- Project name
- Areas
- Products
- Pages
- _ViewImports
- About
- Index
- Pages
- Services
- Pages
- Manage
- About
- Index
- Manage
- Pages
- Products
- Areas
Link generatie met Razor pagina's en gebieden
De volgende code van het voorbeelddownload toont het genereren van koppelingen met het opgegeven gebied (bijvoorbeeld 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>
De voorbeelddownload bevat een gedeeltelijke weergave met de voorgaande koppelingen en dezelfde koppelingen zonder het gebied op te geven. Er wordt in het indelingsbestand naar de gedeeltelijke weergave verwezen, zodat op elke pagina in de app de gegenereerde koppelingen worden weergegeven. De koppelingen die worden gegenereerd zonder het gebied op te geven, zijn alleen geldig wanneer naar een pagina in hetzelfde gebied wordt verwezen.
Wanneer het gebied niet is opgegeven, is routering afhankelijk van de omgevingswaarden . De huidige routewaarden van de huidige aanvraag worden beschouwd als omgevingswaarden voor het genereren van koppelingen. In veel gevallen voor de voorbeeld-app genereert het gebruik van de omgevingswaarden onjuiste koppelingen. Denk bijvoorbeeld aan de koppelingen die zijn gegenereerd op basis van de volgende code:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Voor de voorgaande code:
- De koppeling die is gegenereerd op basis van
<a asp-page="/Manage/About">
is alleen juist wanneer de laatste aanvraag voor een pagina inServices
het gebied was. Bijvoorbeeld/Services/Manage/
,/Services/Manage/Index
of/Services/Manage/About
. - De koppeling die is gegenereerd op basis van
<a asp-page="/About">
is alleen correct wanneer de laatste aanvraag voor een pagina in/Home
. - De code is afkomstig van de voorbeelddownload.
Naamruimte en Tag Helpers importeren met _ViewImports-bestand
Een _ViewImports.cshtml
bestand kan aan elke map pagina's worden toegevoegd om de naamruimte en taghelpers voor elke Razor pagina in de map te importeren.
Overweeg het Services-gebied van de voorbeeldcode, dat geen _ViewImports.cshtml
-bestand bevat. Het volgende markering toont de /Services/Manage/AboutRazor pagina:
@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>
In de voorgaande opmaak:
- De volledig gekwalificeerde klassenaam moet worden gebruikt om het model (
@model RPareas.Areas.Services.Pages.Manage.AboutModel
) op te geven. -
Tag Helpers zijn ingeschakeld door
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
In het voorbeelddownload bevat het gebied Producten het volgende _ViewImports.cshtml
bestand:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
De volgende markup laat de /Products/AboutRazor pagina zien:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
In het voorgaande bestand worden de namespace en @addTagHelper
directive in het bestand geïmporteerd door het Areas/Products/Pages/_ViewImports.cshtml
bestand.
Zie Het bereik tag-helper beheren en gedeelde richtlijnen importeren voor meer informatie.
Gedeelde indeling voor Razor paginagebieden
Als u een algemene indeling voor de hele app wilt delen, verplaatst u de _ViewStart.cshtml
map naar de hoofdmap van de toepassing.
Publishing Areas
Alle *.cshtml-bestanden en bestanden in de wwwroot-map worden naar de uitvoer gepubliceerd wanneer deze zijn opgenomen in het *.csproj-bestand.
MVC-gebied toevoegen met Visual Studio
Klik in Solution Explorer met de rechtermuisknop op het project en selecteer Nieuw scaffolded Item toevoegen >en selecteer vervolgens MVC-gebied.
Gebieden zijn een ASP.NET functie die wordt gebruikt om gerelateerde functionaliteit in een groep te organiseren als een afzonderlijke naamruimte (voor routering) en mapstructuur (voor weergaven). Door gebieden te gebruiken, wordt een hiërarchie gemaakt voor routering door een andere routeparameter toe area
te voegen aan controller
en action
of een Razor pagina page
.
Gebieden bieden een manier om een ASP.NET Core-web-app te partitioneren in kleinere functionele groepen, elk met een eigen set Razor pagina's, controllers, weergaven en modellen. Een gebied is effectief een structuur binnen een app. In een ASP.NET Core-webproject worden logische onderdelen zoals Pagina's, Model, Controller en Weergave bewaard in verschillende mappen. De ASP.NET Core-runtime maakt gebruik van naamconventies om de relatie tussen deze onderdelen te maken. Voor een grote app kan het voordelig zijn om de app te partitioneren in afzonderlijke gebieden met functionaliteit op hoog niveau. Bijvoorbeeld een e-commerce-app met meerdere bedrijfseenheden, zoals afrekenen, facturering en zoeken. Elk van deze eenheden heeft een eigen gebied voor weergaven, controllers, Razor pagina's en modellen.
Overweeg gebieden in een project te gebruiken wanneer:
- De app is gemaakt van meerdere functionele onderdelen op hoog niveau die logisch kunnen worden gescheiden.
- U wilt de app partitioneren, zodat elk functioneel gebied onafhankelijk kan worden bewerkt.
Voorbeeldcode bekijken of downloaden (hoe u kunt downloaden). Het downloadvoorbeeld biedt een eenvoudige app voor testgebieden.
Als u Razor Pagina's gebruikt, raadpleegt u Gebieden met Razor Pagina's in dit document.
Gebieden voor controllers met weergaven
Een typische ASP.NET Core-web-app met gebieden, controllers en weergaven bevat het volgende:
Controllers met het
[Area]
kenmerk om de controller te koppelen aan het gebied:[Area("Products")] public class ManageController : Controller {
De gebiedsroute toegevoegd bij het opstarten:
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?}"); });
Structuur van gebiedsmap
Overweeg een app met twee logische groepen, Producten en Services. Met behulp van gebieden zou de mapstructuur er ongeveer als volgt uitzien:
- Project name
- Areas
- Products
- Controllers
- HomeController.cs
- ManageController.cs
- Views
- Home
- Index.cshtml
- Manage
- Index.cshtml
- About.cshtml
- Home
- Controllers
- Services
- Controllers
- HomeController.cs
- Views
- Home
- Index.cshtml
- Home
- Controllers
- Products
- Areas
Hoewel de voorgaande indeling gebruikelijk is wanneer u Gebieden gebruikt, zijn alleen de weergavebestanden vereist om deze mapstructuur te gebruiken. Detectiezoekopdrachten weergeven naar een overeenkomend gebiedsweergavebestand in de volgende volgorde:
/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
De controller koppelen aan een gebied
Gebiedscontrollers worden aangewezen met het kenmerk [Gebied] :
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();
}
}
}
Gebiedsroute toevoegen
Gebiedsroutes gebruiken doorgaans conventionele routering in plaats van kenmerkroutering. Conventionele routering is orderafhankelijk. Over het algemeen moeten routes met gebieden eerder in de routetabel worden geplaatst, omdat ze specifieker zijn dan routes zonder een gebied.
{area:...}
kan worden gebruikt als een token in routesjablonen als de URL-ruimte uniform is voor alle gebieden:
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?}");
});
}
In de voorgaande code exists
past u een beperking toe die de route moet overeenkomen met een gebied. Het gebruik {area:...}
is het minst gecompliceerde mechanisme voor het toevoegen van routering aan gebieden.
De volgende code gebruikt MapAreaRoute om twee benoemde gebiedenroutes te maken.
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?}");
});
}
Als u MapAreaRoute
met ASP.NET Core 2.2 gebruikt, raadpleegt u dit GitHub-probleem.
Zie Gebiedsroutering voor meer informatie.
Generatie van koppeling met MVC-gebieden
De volgende code uit de voorbeelddownload toont het genereren van koppelingen met het opgegeven gebied:
<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>
De koppelingen die met de voorgaande code zijn gegenereerd, zijn overal in de app geldig.
De voorbeelddownload bevat een gedeeltelijke weergave met de voorgaande koppelingen en dezelfde koppelingen zonder het gebied op te geven. Er wordt in het indelingsbestand naar de gedeeltelijke weergave verwezen, zodat op elke pagina in de app de gegenereerde koppelingen worden weergegeven. De koppelingen die worden gegenereerd zonder het gebied op te geven, zijn alleen geldig wanneer naar een pagina in hetzelfde gebied en dezelfde controller wordt verwezen.
Wanneer het gebied of de controller niet is opgegeven, is routering afhankelijk van de omgevingswaarden . De huidige routewaarden van de huidige aanvraag worden beschouwd als omgevingswaarden voor het genereren van koppelingen. In veel gevallen voor de voorbeeld-app genereert het gebruik van de omgevingswaarden onjuiste koppelingen.
Zie Routering naar controlleracties voor meer informatie.
Gedeelde indeling voor gebieden met behulp van het bestand _ViewStart.cshtml
Als u een algemene indeling voor de hele app wilt delen, verplaatst u de _ViewStart.cshtml
map naar de hoofdmap van de toepassing.
_ViewImports.cshtml
Op de standaardlocatie /Views/_ViewImports.cshtml
is dit niet van toepassing op gebieden. Als u algemene Tag Helpers, @using
of @inject
in uw gebied wilt gebruiken, zorg dan dat een correct _ViewImports.cshtml
bestand van toepassing is op uw gebiedsweergaven. Als u hetzelfde gedrag in al uw weergaven wilt, verplaatst u /Views/_ViewImports.cshtml
naar de hoofdmap van de toepassing.
Standaardgebiedmap wijzigen waarin weergaven worden opgeslagen
Met de volgende code wordt de standaardgebiedmap gewijzigd van "Areas"
in "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();
}
Gebieden die Razor pagina's hebben
Gebieden met Razor Pagina's vereisen een Areas/<area name>/Pages
map in de rootmap van de app. De volgende mapstructuur wordt gebruikt met de voorbeeld-app:
- Project name
- Areas
- Products
- Pages
- _ViewImports
- About
- Index
- Pages
- Services
- Pages
- Manage
- About
- Index
- Manage
- Pages
- Products
- Areas
Link generatie met Razor pagina's en gebieden
De volgende code van het voorbeelddownload toont het genereren van koppelingen met het opgegeven gebied (bijvoorbeeld 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>
De koppelingen die met de voorgaande code zijn gegenereerd, zijn overal in de app geldig.
De voorbeelddownload bevat een gedeeltelijke weergave met de voorgaande koppelingen en dezelfde koppelingen zonder het gebied op te geven. Er wordt in het indelingsbestand naar de gedeeltelijke weergave verwezen, zodat op elke pagina in de app de gegenereerde koppelingen worden weergegeven. De koppelingen die worden gegenereerd zonder het gebied op te geven, zijn alleen geldig wanneer naar een pagina in hetzelfde gebied wordt verwezen.
Wanneer het gebied niet is opgegeven, is routering afhankelijk van de omgevingswaarden . De huidige routewaarden van de huidige aanvraag worden beschouwd als omgevingswaarden voor het genereren van koppelingen. In veel gevallen voor de voorbeeld-app genereert het gebruik van de omgevingswaarden onjuiste koppelingen. Denk bijvoorbeeld aan de koppelingen die zijn gegenereerd op basis van de volgende code:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Voor de voorgaande code:
- De koppeling die is gegenereerd op basis van
<a asp-page="/Manage/About">
is alleen juist wanneer de laatste aanvraag voor een pagina inServices
het gebied was. Bijvoorbeeld/Services/Manage/
,/Services/Manage/Index
of/Services/Manage/About
. - De koppeling die is gegenereerd op basis van
<a asp-page="/About">
is alleen correct wanneer de laatste aanvraag voor een pagina in/Home
. - De code is afkomstig van de voorbeelddownload.
Naamruimte en Tag Helpers importeren met _ViewImports-bestand
Een _ViewImports.cshtml
bestand kan aan elke map pagina's worden toegevoegd om de naamruimte en taghelpers voor elke Razor pagina in de map te importeren.
Overweeg het Services-gebied van de voorbeeldcode, dat geen _ViewImports.cshtml
-bestand bevat. Het volgende markering toont de /Services/Manage/AboutRazor pagina:
@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>
In de voorgaande opmaak:
- De volledig gekwalificeerde domeinnaam moet worden gebruikt om het model (
@model RPareas.Areas.Services.Pages.Manage.AboutModel
) op te geven. -
Tag Helpers zijn ingeschakeld door
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
In het voorbeelddownload bevat het gebied Producten het volgende _ViewImports.cshtml
bestand:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
De volgende markup laat de /Products/AboutRazor pagina zien:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
<h2>Products/About</h2>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
In het voorgaande bestand worden de namespace en @addTagHelper
directive in het bestand geïmporteerd door het Areas/Products/Pages/_ViewImports.cshtml
bestand.
Zie Het bereik tag-helper beheren en gedeelde richtlijnen importeren voor meer informatie.
Gedeelde indeling voor Razor paginagebieden
Als u een algemene indeling voor de hele app wilt delen, verplaatst u de _ViewStart.cshtml
map naar de hoofdmap van de toepassing.
Publishing Areas
Alle *.cshtml-bestanden en bestanden in de wwwroot-map worden naar de uitvoer gepubliceerd wanneer deze zijn opgenomen in het *.csproj-bestand.