Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Dhananjay Kumar és Rick Anderson
A területek egy ASP.NET funkció, amellyel a kapcsolódó funkciók külön csoportba rendezhetőek:
- Útválasztás névtere.
- A nézetek és Razor lapok mappastruktúrája.
A területek használata hierarchiát hoz létre az útvonal meghatározása céljából azáltal, hogy egy másik útvonalparamétert, area, hozzáad a controller és action elemekhez, vagy egy Razor oldalhoz page.
A területek lehetővé teszik a ASP.NET Core-webalkalmazások particionálását kisebb funkcionális csoportokba, amelyek mindegyike saját lapkészlettel Razor , vezérlőkkel, nézetekkel és modellekkel rendelkezik. A terület gyakorlatilag egy alkalmazáson belüli struktúra. Egy ASP.NET Core webes projektben a logikai összetevők, például a Lapok, a Modell, a Vezérlő és a Nézet különböző mappákban vannak tárolva. A ASP.NET Core futtatókörnyezet elnevezési konvenciók használatával hozza létre az összetevők közötti kapcsolatot. Nagy méretű alkalmazások esetén előnyös lehet az alkalmazás particionálása különböző magas szintű funkciókra. Például egy e-kereskedelmi alkalmazás több üzleti egységtel, például a fizetéssel, a számlázással és a kereséssel. Mindegyik egység saját területtel rendelkezik, amely nézeteket, vezérlőket, Razor oldalakat és modelleket tartalmaz.
Fontolja meg a területek használatát egy projektben, ha:
- Az alkalmazás több magas szintű funkcionális összetevőből áll, amelyek logikailag elválaszthatók egymástól.
- Particionálást szeretne végezni az alkalmazáson, hogy minden funkcionális terület egymástól függetlenül működjön.
Ha Razor oldalak funkciót használja, tekintse meg a dokumentumban a oldalakkal rendelkező Razor területeket.
A nézetekkel rendelkező vezérlők területei
A területeket, vezérlőket és nézeteket használó tipikus ASP.NET Core-webalkalmazás a következőket tartalmazza:
A vezérlőt a
[Area]területhez társító attribútummal rendelkező vezérlők:[Area("Products")] public class ManageController : Controller {A terület útvonala hozzáadva a következőhöz
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();
Területmappa-struktúra
Vegyünk egy olyan alkalmazást, amely két logikai csoportból áll: Termékek és szolgáltatások. A területek használata esetén a mappastruktúra a következőhöz hasonló:
- Projekt neve
- 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
Bár az előző elrendezés jellemző a Területek használatakor, csak a nézetfájlokra van szükség a mappastruktúra használatához. A felderítési keresések az alábbi sorrendben keresnek egyező területnézetfájlt:
/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
A vezérlő társítása egy zónával
A területvezérlők a következő attribútummal [Area] vannak kijelölve:
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();
}
}
Útvonal hozzáadása terület szerint
A területútvonalak jellemzően hagyományos útválasztásthasználnak attribútumalapú útválasztás helyett. A hagyományos útválasztás sorrendfüggő. Általánosságban elmondható, hogy a területekkel rendelkező útvonalakat korábban kell elhelyezni az útvonaltáblában, mivel azok pontosabbak, mint a terület nélküli útvonalak.
{area:...} tokénként használható az útvonalsablonokban, ha az URL tér minden területen egységes:
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();
Az előző kódban olyan korlátozást alkalmaz, exists amelyet az útvonalnak egy adott területnek kell megfelelnie. Használat {area:...} a következővel MapControllerRoute:
- A legegyszerűbb mechanizmus a területek útvonalának hozzáadására.
- Megegyezik az attribútummal rendelkező
[Area("Area name")]összes vezérlővel.
A következő kód két elnevezett területútvonal létrehozásához használja MapAreaControllerRoute :
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();
További információ: Területalapú útválasztás.
Az MVC-területekhez tartozó linkek generálása
A mintaletöltésből származó következő kód a hivatkozás létrehozását mutatja a megadott területtel:
<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>
A mintaletöltés egy részleges nézetet tartalmaz, amely a következőket tartalmazza:
- Az előző hivatkozások.
- Az előzőhöz hasonló hivatkozások, kivéve hogy
areanincs megadva.
A részleges nézetre az elrendezésfájl hivatkozik, így az alkalmazás minden oldala megjeleníti a létrehozott hivatkozásokat. A terület megadása nélkül létrehozott hivatkozások csak akkor érvényesek, ha ugyanazon a területen és vezérlőben található oldalról hivatkoznak rá.
Ha a terület vagy a vezérlő nincs megadva, az útválasztás a környezeti értékektől függ. Az aktuális kérés aktuális útvonalértékei környezeti értékeknek minősülnek a kapcsolat létrehozásához. A mintaalkalmazás esetében a környezeti értékek használata sok esetben helytelen kapcsolatokat hoz létre az olyan jelölésekkel, amelyek nem határozzák meg a területet.
További információ: Útválasztás vezérlőműveletekhez.
Megosztott elrendezés a _ViewStart.cshtml fájlt használó területekhez
A teljes alkalmazás közös elrendezésének megosztásához tartsa meg a _ViewStart.cshtml fájlt az alkalmazás gyökérmappájában. További információ: Elrendezés a ASP.NET Core-ban
Alkalmazás gyökérmappája
Az alkalmazás gyökérmappája az a mappa, amely a Program.cs ASP.NET Core-sablonokkal létrehozott webalkalmazásban található fájlt tartalmazza.
_ViewImports.cshtml
/Views/_ViewImports.cshtml az MVC esetén, és /Pages/_ViewImports.cshtml a Razor Pages oldal esetében, nincs importálva a területek nézeteibe. Az alábbi módszerek egyikével biztosíthatja a nézetimportálást az összes nézethez:
- Adja hozzá a _ViewImports.cshtml fájlt az alkalmazás gyökérmappájába. Az alkalmazás gyökérmappájában található _ViewImports.cshtml az alkalmazás összes nézetére érvényes lesz.
- Másolja a _ViewImports.cshtml fájlt a megfelelő nézetmappába a területek alatt. Az egyéni fiókokkal létrehozott Pages-alkalmazásokban például Razor_ViewImports.cshtml fájl található a következő mappákban:
- /Areas/Identity/Pages/_ViewImports.cshtml
- /Pages/_ViewImports.cshtml
A _ViewImports.cshtml fájl általában tartalmazza a Címkesegítők importálását és @using@inject az utasításokat. További információ: Megosztott irányelvek importálása.
A nézetek tárolására szolgáló alapértelmezett területmappa módosítása
Az alábbi kód az alapértelmezett területmappát a következőre "Areas""MyAreas"módosítja:
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();
Területek Razor oldalakkal
A Lapokat tartalmazó Razor területekhez szükség van egy Areas/<area name>/Pages mappára az alkalmazás gyökerében. A mintaalkalmazás a következő mappastruktúrát használja:
- Projekt neve
- Areas
- Products
- Pages
- _ViewImports
- About
- Index
- Pages
- Services
- Pages
- Manage
- About
- Index
- Manage
- Pages
- Products
- Areas
Linkek generálása Razor oldalakkal és területekkel
A mintaletöltés alábbi kódja a megadott területtel rendelkező hivatkozáslétrehozásokat jeleníti meg (például 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>
A mintaletöltés egy részleges nézetet tartalmaz, amely az előző hivatkozásokat és ugyanazokat a hivatkozásokat tartalmazza a terület megadása nélkül. A részleges nézetre az elrendezésfájl hivatkozik, így az alkalmazás minden oldala megjeleníti a létrehozott hivatkozásokat. A terület megadása nélkül létrehozott hivatkozások csak akkor érvényesek, ha ugyanazon a területen lévő oldalról hivatkoznak rá.
Ha a terület nincs megadva, az útválasztás a környezeti értékektől függ. Az aktuális kérés aktuális útvonalértékei környezeti értékeknek minősülnek a kapcsolat létrehozásához. A mintaalkalmazás esetében a környezeti értékek használata sok esetben helytelen hivatkozásokat eredményez. Vegyük például a következő kódból létrehozott hivatkozásokat:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Az előző kód esetében:
- A létrehozott
<a asp-page="/Manage/About">hivatkozás csak akkor helyes, ha az utolsó kérés egy adott területen lévőServiceslapra vonatkozik. Például,/Services/Manage/vagy/Services/Manage/Index/Services/Manage/About. - A létrehozott
<a asp-page="/About">hivatkozás csak akkor helyes, ha az utolsó kérés a/Homeegy lapjára vonatkozott. - A kód a mintaletöltésből származik.
Névtér importálása és Tag Helpek használata _ViewImports fájllal
A _ViewImports.cshtml fájl hozzáadható az egyes területek Lapok mappáihoz, hogy importálja a névteret és a címkesegítőket a mappa minden Razor lapjára.
Vegye figyelembe a mintakód Szolgáltatások területét, amely nem tartalmaz _ViewImports.cshtml fájlt. Az alábbi korrektúra a /Services/Manage/About oldalt jeleníti megRazor:
@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>
Az előző jelölésben:
- A modell (
@model RPareas.Areas.Services.Pages.Manage.AboutModel) megadásához a teljes osztálynevet kell használni. -
A címkesegítők engedélyezve vannak a következővel:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
A mintaletöltésben a Termékek terület a következő _ViewImports.cshtml fájlt tartalmazza:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Az alábbi korrektúra a /Products/About oldalt jeleníti megRazor:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
Az előző fájlban a névtér és a @addTagHelper irányelv a Areas/Products/Pages/_ViewImports.cshtml fájlból kerül importálásra.
További információ: Címkesegítő hatókör kezelése és megosztott irányelvek importálása.
Lapterületek megosztott elrendezése Razor
A teljes alkalmazás közös elrendezésének megosztásához helyezze át a _ViewStart.cshtml fájlt az alkalmazás gyökérmappájába.
Közzétételi területek
A *.csproj fájlba való bevonás esetén az összes *.cshtml fájl és a wwwroot könyvtárban található fájlok megjelennek a kimenetben.
MVC-terület hozzáadása a Visual Studióval
A Megoldáskezelőben kattintson a jobb gombbal a projektre, és válassza az Add New Scaffolded Item(Új állványozott elem hozzáadása>) lehetőséget, majd válassza az MVC Terület lehetőséget.
További erőforrások
- Mintakód megtekintése vagy letöltése (hogyan töltsük le). A letöltési minta egy alapszintű alkalmazást biztosít a tesztelési területekhez.
-
MyDisplayRouteInfo és ToCtxString a Rick.Docs.Samples.RouteInfo NuGet csomag biztosítja. A metódusok
ControllerésRazor Pageútvonaladatokat jelenítenek meg.
A területek egy ASP.NET funkció, amellyel a kapcsolódó funkciók külön csoportba rendezhetőek:
- Útválasztás névtere.
- A nézetek és Razor lapok mappastruktúrája.
A területek használata hierarchiát hoz létre az útvonal meghatározása céljából azáltal, hogy egy másik útvonalparamétert, area, hozzáad a controller és action elemekhez, vagy egy Razor oldalhoz page.
A területek lehetővé teszik a ASP.NET Core-webalkalmazások particionálását kisebb funkcionális csoportokba, amelyek mindegyike saját lapkészlettel Razor , vezérlőkkel, nézetekkel és modellekkel rendelkezik. A terület gyakorlatilag egy alkalmazáson belüli struktúra. Egy ASP.NET Core webes projektben a logikai összetevők, például a Lapok, a Modell, a Vezérlő és a Nézet különböző mappákban vannak tárolva. A ASP.NET Core futtatókörnyezet elnevezési konvenciók használatával hozza létre az összetevők közötti kapcsolatot. Nagy méretű alkalmazások esetén előnyös lehet az alkalmazás particionálása különböző magas szintű funkciókra. Például egy e-kereskedelmi alkalmazás több üzleti egységtel, például a fizetéssel, a számlázással és a kereséssel. Mindegyik egység saját területtel rendelkezik, amely nézeteket, vezérlőket, Razor oldalakat és modelleket tartalmaz.
Fontolja meg a területek használatát egy projektben, ha:
- Az alkalmazás több magas szintű funkcionális összetevőből áll, amelyek logikailag elválaszthatók egymástól.
- Particionálást szeretne végezni az alkalmazáson, hogy minden funkcionális terület egymástól függetlenül működjön.
Mintakód megtekintése vagy letöltése (hogyan töltsük le). A letöltési minta egy alapszintű alkalmazást biztosít a tesztelési területekhez.
Ha Razor oldalak funkciót használja, tekintse meg a dokumentumban a oldalakkal rendelkező Razor területeket.
A nézetekkel rendelkező vezérlők területei
A területeket, vezérlőket és nézeteket használó tipikus ASP.NET Core-webalkalmazás a következőket tartalmazza:
A vezérlőt a
[Area]területhez társító attribútummal rendelkező vezérlők:[Area("Products")] public class ManageController : Controller {Az indításhoz hozzáadott területútvonal:
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?}"); });
Területmappa-struktúra
Vegyünk egy olyan alkalmazást, amely két logikai csoportból áll: Termékek és szolgáltatások. A területek használata esetén a mappastruktúra a következőhöz hasonló:
- Projekt neve
- 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
Bár az előző elrendezés jellemző a Területek használatakor, csak a nézetfájlokra van szükség a mappastruktúra használatához. A felderítési keresések az alábbi sorrendben keresnek egyező területnézetfájlt:
/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
A vezérlő társítása egy zónával
A területvezérlők a [Terület] attribútummal vannak kijelölve:
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();
}
}
}
Útvonal hozzáadása terület szerint
A területútvonalak jellemzően hagyományos útválasztásthasználnak attribútumalapú útválasztás helyett. A hagyományos útválasztás sorrendfüggő. Általánosságban elmondható, hogy a területekkel rendelkező útvonalakat korábban kell elhelyezni az útvonaltáblában, mivel azok pontosabbak, mint a terület nélküli útvonalak.
{area:...} tokénként használható az útvonalsablonokban, ha az URL tér minden területen egységes:
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?}");
});
}
Az előző kódban olyan korlátozást alkalmaz, exists amelyet az útvonalnak egy adott területnek kell megfelelnie. Használat {area:...} a következővel MapControllerRoute:
- A legegyszerűbb mechanizmus a területek útvonalának hozzáadására.
- Megegyezik az attribútummal rendelkező
[Area("Area name")]összes vezérlővel.
A következő kód két elnevezett területútvonal létrehozásához használja MapAreaControllerRoute :
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?}");
});
}
További információ: Területalapú útválasztás.
Az MVC-területekhez tartozó linkek generálása
A mintaletöltésből származó következő kód a hivatkozás létrehozását mutatja a megadott területtel:
<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>
A mintaletöltés egy részleges nézetet tartalmaz, amely a következőket tartalmazza:
- Az előző hivatkozások.
- Az előzőhöz hasonló hivatkozások, kivéve hogy
areanincs megadva.
A részleges nézetre az elrendezésfájl hivatkozik, így az alkalmazás minden oldala megjeleníti a létrehozott hivatkozásokat. A terület megadása nélkül létrehozott hivatkozások csak akkor érvényesek, ha ugyanazon a területen és vezérlőben található oldalról hivatkoznak rá.
Ha a terület vagy a vezérlő nincs megadva, az útválasztás a környezeti értékektől függ. Az aktuális kérés aktuális útvonalértékei környezeti értékeknek minősülnek a kapcsolat létrehozásához. A mintaalkalmazás esetében a környezeti értékek használata sok esetben helytelen kapcsolatokat hoz létre az olyan jelölésekkel, amelyek nem határozzák meg a területet.
További információ: Útválasztás vezérlőműveletekhez.
Megosztott elrendezés a _ViewStart.cshtml fájlt használó területekhez
A teljes alkalmazás általános elrendezésének megosztásához helyezze el a _ViewStart.cshtml fájlt az alkalmazás gyökérmappájában. További információ: Elrendezés a ASP.NET Core-ban
Alkalmazás gyökérmappája
Az alkalmazás gyökérmappája az a mappa, amely Startup.cs a ASP.NET Core-sablonokkal létrehozott webalkalmazásban található.
_ViewImports.cshtml
/Views/_ViewImports.cshtml, az MVC-hez és /Pages/_ViewImports.cshtml, a Razor Pages-hez, nem lesz importálva a területnézetekbe. Az alábbi módszerek egyikével biztosíthatja a nézetimportálást az összes nézethez:
- Adja hozzá
_ViewImports.cshtmlaz alkalmazás gyökérmappájába. Az_ViewImports.cshtmlaz alkalmazás gyökérmappájában az alkalmazás összes nézetére vonatkozni fog. - Másolja a
_ViewImports.cshtmlfájlt a megfelelő nézetmappába az előre megadott területek alatt.
A _ViewImports.cshtml fájl általában tartalmazza a Címkesegítők importálását és @using@inject az utasításokat. További információ: Megosztott irányelvek importálása.
A nézetek tárolására szolgáló alapértelmezett területmappa módosítása
Az alábbi kód az alapértelmezett területmappát a következőre "Areas""MyAreas"módosítja:
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();
}
Területek Razor oldalakkal
A Lapokat tartalmazó Razor területekhez szükség van egy Areas/<area name>/Pages mappára az alkalmazás gyökerében. A mintaalkalmazás a következő mappastruktúrát használja:
- Projekt neve
- Areas
- Products
- Pages
- _ViewImports
- About
- Index
- Pages
- Services
- Pages
- Manage
- About
- Index
- Manage
- Pages
- Products
- Areas
Linkek generálása Razor oldalakkal és területekkel
A mintaletöltés alábbi kódja a megadott területtel rendelkező hivatkozáslétrehozásokat jeleníti meg (például 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>
A mintaletöltés egy részleges nézetet tartalmaz, amely az előző hivatkozásokat és ugyanazokat a hivatkozásokat tartalmazza a terület megadása nélkül. A részleges nézetre az elrendezésfájl hivatkozik, így az alkalmazás minden oldala megjeleníti a létrehozott hivatkozásokat. A terület megadása nélkül létrehozott hivatkozások csak akkor érvényesek, ha ugyanazon a területen lévő oldalról hivatkoznak rá.
Ha a terület nincs megadva, az útválasztás a környezeti értékektől függ. Az aktuális kérés aktuális útvonalértékei környezeti értékeknek minősülnek a kapcsolat létrehozásához. A mintaalkalmazás esetében a környezeti értékek használata sok esetben helytelen hivatkozásokat eredményez. Vegyük például a következő kódból létrehozott hivatkozásokat:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Az előző kód esetében:
- A létrehozott
<a asp-page="/Manage/About">hivatkozás csak akkor helyes, ha az utolsó kérés egy adott területen lévőServiceslapra vonatkozik. Például,/Services/Manage/vagy/Services/Manage/Index/Services/Manage/About. - A létrehozott
<a asp-page="/About">hivatkozás csak akkor helyes, ha az utolsó kérés a/Homeegy lapjára vonatkozott. - A kód a mintaletöltésből származik.
Névtér importálása és Tag Helpek használata _ViewImports fájllal
Az egyes területek _ViewImports.cshtml mappáihoz hozzáadható egy fájl, amely importálja a névteret és a címkesegítőket a mappa minden lapjára.
Fontolja meg a mintakód Szolgáltatások területét, amely nem tartalmaz _ViewImports.cshtml fájlt. Az alábbi korrektúra a /Services/Manage/About oldalt jeleníti megRazor:
@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>
Az előző jelölésben:
- A modell (
@model RPareas.Areas.Services.Pages.Manage.AboutModel) megadásához a teljes osztálynevet kell használni. -
A címkesegítők engedélyezve vannak a következővel:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
A mintaletöltésben a Termékek terület a következő _ViewImports.cshtml fájlt tartalmazza:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Az alábbi korrektúra a /Products/About oldalt jeleníti megRazor:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
Az előző fájlban a @addTagHelper fájl importálja a névteret és a Areas/Products/Pages/_ViewImports.cshtml irányelvet a fájlba.
További információ: Címkesegítő hatókör kezelése és megosztott irányelvek importálása.
Lapterületek megosztott elrendezése Razor
A teljes alkalmazás közös elrendezésének megosztásához helyezze át az _ViewStart.cshtml alkalmazást az alkalmazás gyökérmappájába.
Közzétételi területek
A *.csproj fájlba való bevonás esetén az összes *.cshtml fájl és a wwwroot könyvtárban található fájlok megjelennek a kimenetben.
MVC-terület hozzáadása a Visual Studióval
A Megoldáskezelőben kattintson a jobb gombbal a projektre, és válassza az Add New Scaffolded Item(Új állványozott elem hozzáadása>) lehetőséget, majd válassza az MVC Terület lehetőséget.
A területek egy ASP.NET funkció, amellyel a kapcsolódó funkciókat külön névtérként (útválasztáshoz) és mappastruktúrává (nézetekhez) csoportosíthatja. A területek használata hierarchiát hoz létre az útvonal meghatározása céljából azáltal, hogy egy másik útvonalparamétert, area, hozzáad a controller és action elemekhez, vagy egy Razor oldalhoz page.
A területek lehetővé teszik a ASP.NET Core-webalkalmazások particionálását kisebb funkcionális csoportokba, amelyek mindegyike saját lapkészlettel Razor , vezérlőkkel, nézetekkel és modellekkel rendelkezik. A terület gyakorlatilag egy alkalmazáson belüli struktúra. Egy ASP.NET Core webes projektben a logikai összetevők, például a Lapok, a Modell, a Vezérlő és a Nézet különböző mappákban vannak tárolva. A ASP.NET Core futtatókörnyezet elnevezési konvenciók használatával hozza létre az összetevők közötti kapcsolatot. Nagy méretű alkalmazások esetén előnyös lehet az alkalmazás particionálása különböző magas szintű funkciókra. Például egy e-kereskedelmi alkalmazás több üzleti egységtel, például a fizetéssel, a számlázással és a kereséssel. Mindegyik egység saját területtel rendelkezik, amely nézeteket, vezérlőket, Razor oldalakat és modelleket tartalmaz.
Fontolja meg a területek használatát egy projektben, ha:
- Az alkalmazás több magas szintű funkcionális összetevőből áll, amelyek logikailag elválaszthatók egymástól.
- Particionálást szeretne végezni az alkalmazáson, hogy minden funkcionális terület egymástól függetlenül működjön.
Mintakód megtekintése vagy letöltése (hogyan töltsük le). A letöltési minta egy alapszintű alkalmazást biztosít a tesztelési területekhez.
Ha Razor oldalak funkciót használja, tekintse meg a dokumentumban a oldalakkal rendelkező Razor területeket.
A nézetekkel rendelkező vezérlők területei
A területeket, vezérlőket és nézeteket használó tipikus ASP.NET Core-webalkalmazás a következőket tartalmazza:
A vezérlőt a
[Area]területhez társító attribútummal rendelkező vezérlők:[Area("Products")] public class ManageController : Controller {Az indításhoz hozzáadott területútvonal:
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?}"); });
Területmappa-struktúra
Vegyünk egy olyan alkalmazást, amely két logikai csoportból áll: Termékek és szolgáltatások. A területek használata esetén a mappastruktúra a következőhöz hasonló:
- Projekt neve
- 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
Bár az előző elrendezés jellemző a Területek használatakor, csak a nézetfájlokra van szükség a mappastruktúra használatához. A felderítési keresések az alábbi sorrendben keresnek egyező területnézetfájlt:
/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
A vezérlő társítása egy zónával
A területvezérlők a [Terület] attribútummal vannak kijelölve:
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();
}
}
}
Útvonal hozzáadása terület szerint
A területútvonalak jellemzően hagyományos útválasztást használnak attribútumalapú útválasztás helyett. A hagyományos útválasztás sorrendfüggő. Általánosságban elmondható, hogy a területekkel rendelkező útvonalakat korábban kell elhelyezni az útvonaltáblában, mivel azok pontosabbak, mint a terület nélküli útvonalak.
{area:...} tokénként használható az útvonalsablonokban, ha az URL tér minden területen egységes:
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?}");
});
}
Az előző kódban olyan korlátozást alkalmaz, exists amelyet az útvonalnak egy adott területnek kell megfelelnie. A {area:...} használata a legkevésbé bonyolult mechanizmus a területekhez való útválasztás hozzáadásához.
A következő kód két elnevezett területútvonal létrehozásához használja MapAreaRoute :
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?}");
});
}
Ha a ASP.NET Core 2.2-vel használja MapAreaRoute , tekintse meg ezt a GitHub-problémát.
További információ: Területalapú útválasztás.
Az MVC-területekhez tartozó linkek generálása
A mintaletöltésből származó következő kód a hivatkozás létrehozását mutatja a megadott területtel:
<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>
Az előző kóddal létrehozott hivatkozások az alkalmazásban bárhol érvényesek.
A mintaletöltés egy részleges nézetet tartalmaz, amely az előző hivatkozásokat és ugyanazokat a hivatkozásokat tartalmazza a terület megadása nélkül. A részleges nézetre az elrendezésfájl hivatkozik, így az alkalmazás minden oldala megjeleníti a létrehozott hivatkozásokat. A terület megadása nélkül létrehozott hivatkozások csak akkor érvényesek, ha ugyanazon a területen és vezérlőben található oldalról hivatkoznak rá.
Ha a terület vagy a vezérlő nincs megadva, az útválasztás a környezeti értékektől függ. Az aktuális kérés aktuális útvonalértékei környezeti értékeknek minősülnek a kapcsolat létrehozásához. A mintaalkalmazás esetében a környezeti értékek használata sok esetben helytelen hivatkozásokat eredményez.
További információ: Útválasztás vezérlőműveletekhez.
Megosztott elrendezés a _ViewStart.cshtml fájlt használó területekhez
A teljes alkalmazás közös elrendezésének megosztásához helyezze át az _ViewStart.cshtml alkalmazást az alkalmazás gyökérmappájába.
_ViewImports.cshtml
A szokásos helyen /Views/_ViewImports.cshtml nem érvényes a területekre. Ha a közös címkesegítőket, @using vagy @inject az Ön területén szeretné használni, győződjön meg arról, hogy a megfelelő _ViewImports.cshtml fájl vonatkozik a terület nézeteire. Ha minden nézetben ugyanazt a viselkedést szeretné, helyezze át /Views/_ViewImports.cshtml az alkalmazás gyökerébe.
A nézetek tárolására szolgáló alapértelmezett területmappa módosítása
Az alábbi kód az alapértelmezett területmappát a következőre "Areas""MyAreas"módosítja:
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();
}
Területek Razor oldalakkal
A Lapokat tartalmazó Razor területekhez szükség van egy Areas/<area name>/Pages mappára az alkalmazás gyökerében. A mintaalkalmazás a következő mappastruktúrát használja:
- Projekt neve
- Areas
- Products
- Pages
- _ViewImports
- About
- Index
- Pages
- Services
- Pages
- Manage
- About
- Index
- Manage
- Pages
- Products
- Areas
Linkek generálása Razor oldalakkal és területekkel
A mintaletöltés alábbi kódja a megadott területtel rendelkező hivatkozáslétrehozásokat jeleníti meg (például 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>
Az előző kóddal létrehozott hivatkozások az alkalmazásban bárhol érvényesek.
A mintaletöltés egy részleges nézetet tartalmaz, amely az előző hivatkozásokat és ugyanazokat a hivatkozásokat tartalmazza a terület megadása nélkül. A részleges nézetre az elrendezésfájl hivatkozik, így az alkalmazás minden oldala megjeleníti a létrehozott hivatkozásokat. A terület megadása nélkül létrehozott hivatkozások csak akkor érvényesek, ha ugyanazon a területen lévő oldalról hivatkoznak rá.
Ha a terület nincs megadva, az útválasztás a környezeti értékektől függ. Az aktuális kérés aktuális útvonalértékei környezeti értékeknek minősülnek a kapcsolat létrehozásához. A mintaalkalmazás esetében a környezeti értékek használata sok esetben helytelen hivatkozásokat eredményez. Vegyük például a következő kódból létrehozott hivatkozásokat:
<li>
<a asp-page="/Manage/About">
Services/Manage/About
</a>
</li>
<li>
<a asp-page="/About">
/About
</a>
</li>
Az előző kód esetében:
- A létrehozott
<a asp-page="/Manage/About">hivatkozás csak akkor helyes, ha az utolsó kérés egy adott területen lévőServiceslapra vonatkozik. Például,/Services/Manage/vagy/Services/Manage/Index/Services/Manage/About. - A létrehozott
<a asp-page="/About">hivatkozás csak akkor helyes, ha az utolsó kérés a/Homeegy lapjára vonatkozott. - A kód a mintaletöltésből származik.
Névtér importálása és Tag Helpek használata _ViewImports fájllal
Az egyes területek _ViewImports.cshtml mappáihoz hozzáadható egy fájl, amely importálja a névteret és a címkesegítőket a mappa minden lapjára.
Fontolja meg a mintakód Szolgáltatások területét, amely nem tartalmaz _ViewImports.cshtml fájlt. Az alábbi korrektúra a /Services/Manage/About oldalt jeleníti megRazor:
@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>
Az előző jelölésben:
- A modell (
@model RPareas.Areas.Services.Pages.Manage.AboutModel) megadásához a teljes tartománynevet kell használni. -
A címkesegítők engedélyezve vannak a következővel:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
A mintaletöltésben a Termékek terület a következő _ViewImports.cshtml fájlt tartalmazza:
@namespace RPareas.Areas.Products.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Az alábbi korrektúra a /Products/About oldalt jeleníti megRazor:
@page
@model AboutModel
@{
ViewData["Title"] = "Prod About";
}
<h2>Products/About</h2>
<a asp-area="Services" asp-page="/Manage/About">
Services/Manage/About
</a>
Az előző fájlban a @addTagHelper fájl importálja a névteret és a Areas/Products/Pages/_ViewImports.cshtml irányelvet a fájlba.
További információ: Címkesegítő hatókör kezelése és megosztott irányelvek importálása.
Lapterületek megosztott elrendezése Razor
A teljes alkalmazás közös elrendezésének megosztásához helyezze át az _ViewStart.cshtml alkalmazást az alkalmazás gyökérmappájába.
Közzétételi területek
A *.csproj fájlba való bevonás esetén az összes *.cshtml fájl és a wwwroot könyvtárban található fájlok megjelennek a kimenetben.