Megosztás a következőn keresztül:


A ASP.NET Core területei

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:

  • Területmappa-struktúra.

  • 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
      • Services
        • Controllers
          • HomeController.cs
        • Views
          • Home
            • Index.cshtml

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.

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 area nincs 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
      • Services
        • Pages
          • Manage
            • About
            • Index

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ő Services lapra 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 /Home egy 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

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:

  • Területmappa-struktúra.

  • 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
      • Services
        • Controllers
          • HomeController.cs
        • Views
          • Home
            • Index.cshtml

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.

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 area nincs 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.cshtml az alkalmazás gyökérmappájába. Az _ViewImports.cshtml az alkalmazás gyökérmappájában az alkalmazás összes nézetére vonatkozni fog.
  • Másolja a _ViewImports.cshtml fá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
      • Services
        • Pages
          • Manage
            • About
            • Index

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ő Services lapra 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 /Home egy 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:

  • Területmappa-struktúra.

  • 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
      • Services
        • Controllers
          • HomeController.cs
        • Views
          • Home
            • Index.cshtml

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.

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
      • Services
        • Pages
          • Manage
            • About
            • Index

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ő Services lapra 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 /Home egy 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.