Dela via


Områden i ASP.NET Core

Av Dhananjay Kumar och Rick Anderson

Områden är en ASP.NET funktion som används för att organisera relaterade funktioner i en grupp som en separat:

  • Namnområde för routning.
  • Mappstruktur för vyer och Razor sidor.

Med hjälp av områden skapas en hierarki för routning genom att lägga till en annan routningsparameter, area, till controller och action eller en Razor sida page.

Områden ger ett sätt att partitionera en ASP.NET Core-webbapp i mindre funktionella grupper, var och en med sin egen uppsättning Razor sidor, kontrollanter, vyer och modeller. Ett område är i praktiken en struktur i en app. I ett ASP.NET Core-webbprojekt lagras logiska komponenter som Sidor, Modell, Styrenhet och Vy i olika mappar. ASP.NET Core-körningen använder namngivningskonventioner för att skapa relationen mellan dessa komponenter. För en stor app kan det vara fördelaktigt att partitionera appen i separata högnivåområden med funktioner. Till exempel en e-handelsapp med flera affärsenheter, till exempel kassa, fakturering och sökning. Var och en av dessa enheter har ett eget område som innehåller vyer, kontrollanter, Razor sidor och modeller.

Överväg att använda Områden i ett projekt när:

  • Appen består av flera funktionella komponenter på hög nivå som kan separeras logiskt.
  • Du vill dela upp app så att varje funktionsområde kan bearbetas separat.

Om du använder Razor Sidor kan du läsa Områden med Razor Sidor i det här dokumentet.

Områden för kontrollanter med vyer

En typisk ASP.NET Core-webbapp med hjälp av områden, kontrollanter och vyer innehåller följande:

  • En områdesmappsstruktur.

  • Kontrollanter med [Area] attributet för att associera kontrollanten med området:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Områdesvägen har lagts till i 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();
    

Mappstruktur för område

Överväg en app som har två logiska grupper, Produkter och tjänster. Med hjälp av områden skulle mappstrukturen likna följande:

  • Projektnamn
    • Areas
      • Products
        • Controllers
          • HomeController.cs
          • ManageController.cs
        • Views
          • Home
            • Index.cshtml
          • Manage
            • Index.cshtml
            • About.cshtml
      • Services
        • Controllers
          • HomeController.cs
        • Views
          • Home
            • Index.cshtml

Den föregående layouten är vanlig när du använder Områden, men endast visningsfilerna krävs för att använda den här mappstrukturen. Visa sökningar efter en matchande vyfil i området i följande ordning:

/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

Associera kontrollanten med ett område

Områdeskontrollanter är avsedda med [Area] attributet:

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();
    }
}

Lägg till områdesväg

Områdesvägar använder vanligtvis konventionell routning i stället för attributroutning. Konventionell routning är orderberoende. I allmänhet bör vägar med områden placeras tidigare i routningstabellen eftersom de är mer specifika än vägar utan område.

{area:...} kan användas som en token i routningsmallar om URL-utrymmet är enhetligt inom alla områden:

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();

I föregående kod exists tillämpar du en begränsning som vägen måste matcha ett område. Använda {area:...} med MapControllerRoute:

  • Är den minst komplicerade mekanismen för att lägga till routning till områden.
  • Matchar alla kontrollanter med attributet [Area("Area name")] .

Följande kod använder MapAreaControllerRoute för att skapa två namngivna områdesvägar:

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();

Mer information finns i Områdesroutning.

Följande kod från exempelnedladdningen visar länkgenerering med det angivna området:

<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>

Exempelnedladdningen innehåller en partiell vy som innehåller:

  • Föregående länkar.
  • Länkar som liknar föregående, förutom att area inte har angetts.

Den partiella vyn refereras till i layoutfilen, så varje sida i appen visar de genererade länkarna. Länkarna som genereras utan att ange området är endast giltiga när de refereras från en sida i samma område och kontrollant.

När området eller styrenheten inte har angetts beror routningen på omgivningsvärdena . De nuvarande ruttvärdena för den aktuella begäran betraktas som omvarande värden för länkgenerering. I många fall för exempelappen genererar användning av omgivande värden felaktiga länkar med den markering som inte anger området.

Mer information finns i Routning till kontrollantåtgärder.

Delad layout för områden med hjälp av filen _ViewStart.cshtml

Om du vill dela en gemensam layout för hela appen behåller du _ViewStart.cshtml i programrotmappen. Mer information finns i Layout i ASP.NET Core

Rotmapp för program

Rotmappen för programmet är mappen som innehåller Program.cs filen i en webbapp som skapats med ASP.NET Core-mallarna.

_ViewImports.cshtml

/Views/_ViewImports.cshtml, för MVC, och /Pages/_ViewImports.cshtml för Razor Sidor, importeras inte i områdesvyer. Använd någon av följande metoder för att tillämpa vy-importer till alla vyer:

  • Lägg till _ViewImports.cshtml i programrotmappen. En _ViewImports.cshtml i programrotmappen gäller för alla vyer i appen.
  • Kopiera filen _ViewImports.cshtml till lämplig vymapp under områden. Till exempel har en Razor Pages-app som skapats med enskilda konton en _ViewImports.cshtml-fil i följande mappar:
    • /Areas/Identity/Pages/_ViewImports.cshtml
    • /Pages/_ViewImports.cshtml

Filen _ViewImports.cshtml innehåller vanligtvis tag helpers-importer , @usingoch @inject -instruktioner. Mer information finns i Importera delade direktiv.

Ändra standardområdesmappen där vyer lagras

Följande kod ändrar standardområdesmappen från "Areas" till "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();

Områden med Razor sidor

Områden med Razor sidor kräver en Areas/<area name>/Pages mapp i appens rot. Följande mappstruktur används med exempelappen:

  • Projektnamn
    • Areas
      • Products
        • Pages
          • _ViewImports
          • About
          • Index
      • Services
        • Pages
          • Manage
            • About
            • Index

Följande kod från exempelnedladdningen visar länkgenerering med det angivna området (till exempel 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>

Exempelnedladdningen innehåller en partiell vy som innehåller föregående länkar och samma länkar utan att ange området. Den partiella vyn refereras till i layoutfilen, så varje sida i appen visar de genererade länkarna. Länkarna som genereras utan att ange området är endast giltiga när de refereras från en sida i samma område.

När området inte har angetts beror routningen på omgivande värden. De nuvarande ruttvärdena för den aktuella begäran betraktas som omvarande värden för länkgenerering. I många fall för exempelappen genererar användning av omgivande värden felaktiga länkar. Tänk till exempel på länkarna som genereras från följande kod:

<li>
    <a asp-page="/Manage/About">
        Services/Manage/About
    </a>
</li>
<li>
    <a asp-page="/About">
        /About
    </a>
</li>

För föregående kod:

  • Länken som genererades från <a asp-page="/Manage/About"> är endast korrekt när den senaste begäran var för en sida i Services området. Till exempel /Services/Manage/, /Services/Manage/Index, eller /Services/Manage/About.
  • Länken som genererades från <a asp-page="/About"> är endast korrekt när den senaste begäran var för en sida i /Home.
  • Koden är från exempelnedladdningen.

Importera namnområde och tagghjälpmedel med _ViewImports fil

En _ViewImports.cshtml-fil kan läggas till i varje område Pages-mapp för att importera namnområdet och tagghjälparna till varje Razor sida i mappen.

Överväg området Tjänster i exempelkoden, som inte innehåller en _ViewImports.cshtml-fil . Följande markering visar sidan /Services/Manage/AboutRazor :

@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
    ViewData["Title"] = "Srv Mng About";
}

<div>
  ViewData["routeInfo"]:  @ViewData["routeInfo"]
</div>

<a asp-area="Products" asp-page="/Index">
    Products/Index
</a>

I föregående markering:

  • Det fullständigt kvalificerade klassnamnet måste användas för att ange modellen (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Tag Helpers aktiveras av @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

I exempelnedladdningen innehåller området Produkter följande _ViewImports.cshtml-fil :

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

Följande markering visar sidan /Products/AboutRazor :

@page
@model AboutModel
@{
    ViewData["Title"] = "Prod About";
}

I föregående fil importeras namnområdet och @addTagHelper direktivet till filen av filen Areas/Products/Pages/_ViewImports.cshtml .

Mer information finns i Hantera tag Helper-omfång och importera delade direktiv.

Delad layout för Razor sidområden

Om du vill dela en gemensam layout för hela appen flyttar du _ViewStart.cshtml till programrotmappen.

Publiceringsområden

Alla *.cshtml-filer och filer i katalogen wwwroot publiceras till utdata när <Project Sdk="Microsoft.NET.Sdk.Web"> inkluderas i filen *.csproj.

Lägga till MVC-område med Visual Studio

I Solution Explorer högerklickar du på projektet och väljer LÄGG till > nytt autogenererat objekt och väljer sedan MVC-område.

Ytterligare resurser

Områden är en ASP.NET funktion som används för att organisera relaterade funktioner i en grupp som en separat:

  • Namnområde för routning.
  • Mappstruktur för vyer och Razor sidor.

Med hjälp av områden skapas en hierarki för routning genom att lägga till en annan routningsparameter, area, till controller och action eller en Razor sida page.

Områden ger ett sätt att partitionera en ASP.NET Core-webbapp i mindre funktionella grupper, var och en med sin egen uppsättning Razor sidor, kontrollanter, vyer och modeller. Ett område är i praktiken en struktur i en app. I ett ASP.NET Core-webbprojekt lagras logiska komponenter som Sidor, Modell, Styrenhet och Vy i olika mappar. ASP.NET Core-körningen använder namngivningskonventioner för att skapa relationen mellan dessa komponenter. För en stor app kan det vara fördelaktigt att partitionera appen i separata högnivåområden med funktioner. Till exempel en e-handelsapp med flera affärsenheter, till exempel kassa, fakturering och sökning. Var och en av dessa enheter har ett eget område som innehåller vyer, kontrollanter, Razor sidor och modeller.

Överväg att använda Områden i ett projekt när:

  • Appen består av flera funktionella komponenter på hög nivå som kan separeras logiskt.
  • Du vill dela upp app så att varje funktionsområde kan bearbetas separat.

Visa eller ladda ned exempelkod (hur du laddar ned). Nedladdningsexemplet innehåller en grundläggande app för testområden.

Om du använder Razor Sidor kan du läsa Områden med Razor Sidor i det här dokumentet.

Områden för kontrollanter med vyer

En typisk ASP.NET Core-webbapp med hjälp av områden, kontrollanter och vyer innehåller följande:

  • En områdesmappsstruktur.

  • Kontrollanter med [Area] attributet för att associera kontrollanten med området:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Områdesvägen har lagts till för start:

    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?}");
    });
    

Mappstruktur för område

Överväg en app som har två logiska grupper, Produkter och tjänster. Med hjälp av områden skulle mappstrukturen likna följande:

  • Projektnamn
    • Areas
      • Products
        • Controllers
          • HomeController.cs
          • ManageController.cs
        • Views
          • Home
            • Index.cshtml
          • Manage
            • Index.cshtml
            • About.cshtml
      • Services
        • Controllers
          • HomeController.cs
        • Views
          • Home
            • Index.cshtml

Den föregående layouten är vanlig när du använder Områden, men endast visningsfilerna krävs för att använda den här mappstrukturen. Visa sökningar efter en matchande vyfil i området i följande ordning:

/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

Associera kontrollanten med ett område

Områdeskontrollanter är avsedda med attributet [Area] :

using Microsoft.AspNetCore.Mvc;
using Microsoft.Docs.Samples;

namespace MVCareas.Areas.Products.Controllers
{
    [Area("Products")]
    public class ManageController : Controller
    {
        public IActionResult Index()
        {
            ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
            return View();
        }

        public IActionResult About()
        {
            ViewData["routeInfo"] = ControllerContext.MyDisplayRouteInfo();
            return View();
        }
    }
}

Lägg till områdesväg

Områdesvägar använder vanligtvis konventionell routning i stället för attributroutning. Konventionell routning är orderberoende. I allmänhet bör vägar med områden placeras tidigare i routningstabellen eftersom de är mer specifika än vägar utan område.

{area:...} kan användas som en token i routningsmallar om URL-utrymmet är enhetligt inom alla områden:

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?}");
    });
}

I föregående kod exists tillämpar du en begränsning som vägen måste matcha ett område. Använda {area:...} med MapControllerRoute:

  • Är den minst komplicerade mekanismen för att lägga till routning till områden.
  • Matchar alla kontrollanter med attributet [Area("Area name")] .

Följande kod använder MapAreaControllerRoute för att skapa två namngivna områdesvägar:

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?}");
    });
}

Mer information finns i Områdesroutning.

Följande kod från exempelnedladdningen visar länkgenerering med det angivna området:

<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>

Exempelnedladdningen innehåller en partiell vy som innehåller:

  • Föregående länkar.
  • Länkar som liknar föregående, förutom att area inte har angetts.

Den partiella vyn refereras till i layoutfilen, så varje sida i appen visar de genererade länkarna. Länkarna som genereras utan att ange området är endast giltiga när de refereras från en sida i samma område och kontrollant.

När området eller styrenheten inte har angetts beror routningen på omgivningsvärdena . De nuvarande ruttvärdena för den aktuella begäran betraktas som omvarande värden för länkgenerering. I många fall för exempelappen genererar användning av omgivande värden felaktiga länkar med den markering som inte anger området.

Mer information finns i Routning till kontrollantåtgärder.

Delad layout för områden med hjälp av filen _ViewStart.cshtml

Om du vill dela en gemensam layout för hela appen behåller _ViewStart.cshtml du i rotmappen för programmet. Mer information finns i Layout i ASP.NET Core

Rotmapp för program

Rotmappen för programmet är mappen som innehåller Startup.cs i webbappen som skapats med ASP.NET Core-mallarna.

_ViewImports.cshtml

/Views/_ViewImports.cshtml, för MVC och /Pages/_ViewImports.cshtml för Razor Sidor, importeras inte till vyer i områden. Använd någon av följande metoder för att tillämpa vy-importer till alla vyer:

  • Lägg till _ViewImports.cshtml i programmets rotmapp. A _ViewImports.cshtml i programmets rotmapp gäller för alla vyer i appen.
  • _ViewImports.cshtml Kopiera filen till lämplig vymapp under områden.

Filen _ViewImports.cshtml innehåller vanligtvis Tag Helpers-importer , @usingoch @inject -instruktioner. Mer information finns i Importera delade direktiv.

Ändra standardområdesmappen där vyer lagras

Följande kod ändrar standardområdesmappen från "Areas" till "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();
}

Områden med Razor sidor

Områden med Razor sidor kräver en Areas/<area name>/Pages mapp i appens rot. Följande mappstruktur används med exempelappen:

  • Projektnamn
    • Areas
      • Products
        • Pages
          • _ViewImports
          • About
          • Index
      • Services
        • Pages
          • Manage
            • About
            • Index

Följande kod från exempelnedladdningen visar länkgenerering med det angivna området (till exempel 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>

Exempelnedladdningen innehåller en partiell vy som innehåller föregående länkar och samma länkar utan att ange området. Den partiella vyn refereras till i layoutfilen, så varje sida i appen visar de genererade länkarna. Länkarna som genereras utan att ange området är endast giltiga när de refereras från en sida i samma område.

När området inte har angetts beror routningen på omgivande värden. De nuvarande ruttvärdena för den aktuella begäran betraktas som omvarande värden för länkgenerering. I många fall för exempelappen genererar användning av omgivande värden felaktiga länkar. Tänk till exempel på länkarna som genereras från följande kod:

<li>
    <a asp-page="/Manage/About">
        Services/Manage/About
    </a>
</li>
<li>
    <a asp-page="/About">
        /About
    </a>
</li>

För föregående kod:

  • Länken som genererades från <a asp-page="/Manage/About"> är endast korrekt när den senaste begäran var för en sida i Services området. Till exempel /Services/Manage/, /Services/Manage/Index, eller /Services/Manage/About.
  • Länken som genererades från <a asp-page="/About"> är endast korrekt när den senaste begäran var för en sida i /Home.
  • Koden är från exempelnedladdningen.

Importera namnområde och tagghjälpmedel med _ViewImports fil

En _ViewImports.cshtml fil kan läggas till i varje område Pages-mapp för att importera namnområdet och Tag Helpers till varje Razor sida i mappen.

Överväg området Tjänster i exempelkoden, som inte innehåller någon _ViewImports.cshtml fil. Följande markering visar sidan /Services/Manage/AboutRazor :

@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
    ViewData["Title"] = "Srv Mng About";
}

<a asp-area="Products" asp-page="/Index">
    Products/Index
</a>

I föregående markering:

  • Det fullständigt kvalificerade klassnamnet måste användas för att ange modellen (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Tag Helpers aktiveras av @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

I exempelnedladdningen innehåller området Produkter följande _ViewImports.cshtml fil:

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

Följande markering visar sidan /Products/AboutRazor :

@page
@model AboutModel
@{
    ViewData["Title"] = "Prod About";
}

I föregående fil importeras namnområdet och @addTagHelper direktivet till filen av Areas/Products/Pages/_ViewImports.cshtml filen.

Mer information finns i Hantera tag Helper-omfång och importera delade direktiv.

Delad layout för Razor sidområden

Om du vill dela en gemensam layout för hela appen flyttar du _ViewStart.cshtml till rotmappen för programmet.

Publiceringsområden

Alla *.cshtml-filer och filer i katalogen wwwroot publiceras till utdata när <Project Sdk="Microsoft.NET.Sdk.Web"> inkluderas i filen *.csproj.

Lägga till MVC-område med Visual Studio

I Solution Explorer högerklickar du på projektet och väljer LÄGG till > nytt autogenererat objekt och väljer sedan MVC-område.

Områden är en ASP.NET funktion som används för att organisera relaterade funktioner i en grupp som ett separat namnområde (för routning) och mappstruktur (för vyer). Med hjälp av områden skapas en hierarki för routning genom att lägga till en annan routningsparameter, area, till controller och action eller en Razor sida page.

Områden ger ett sätt att partitionera en ASP.NET Core-webbapp i mindre funktionella grupper, var och en med sin egen uppsättning Razor sidor, kontrollanter, vyer och modeller. Ett område är i praktiken en struktur i en app. I ett ASP.NET Core-webbprojekt lagras logiska komponenter som Sidor, Modell, Styrenhet och Vy i olika mappar. ASP.NET Core-körningen använder namngivningskonventioner för att skapa relationen mellan dessa komponenter. För en stor app kan det vara fördelaktigt att partitionera appen i separata högnivåområden med funktioner. Till exempel en e-handelsapp med flera affärsenheter, till exempel kassa, fakturering och sökning. Var och en av dessa enheter har ett eget område som innehåller vyer, kontrollanter, Razor sidor och modeller.

Överväg att använda Områden i ett projekt när:

  • Appen består av flera funktionella komponenter på hög nivå som kan separeras logiskt.
  • Du vill dela upp app så att varje funktionsområde kan bearbetas separat.

Visa eller ladda ned exempelkod (hur du laddar ned). Nedladdningsexemplet innehåller en grundläggande app för testområden.

Om du använder Razor Sidor kan du läsa Områden med Razor Sidor i det här dokumentet.

Områden för kontrollanter med vyer

En typisk ASP.NET Core-webbapp med hjälp av områden, kontrollanter och vyer innehåller följande:

  • En områdesmappsstruktur.

  • Kontrollanter med [Area] attributet för att associera kontrollanten med området:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Områdesvägen har lagts till för start:

    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?}");
    });
    

Mappstruktur för område

Överväg en app som har två logiska grupper, Produkter och tjänster. Med hjälp av områden skulle mappstrukturen likna följande:

  • Projektnamn
    • Areas
      • Products
        • Controllers
          • HomeController.cs
          • ManageController.cs
        • Views
          • Home
            • Index.cshtml
          • Manage
            • Index.cshtml
            • About.cshtml
      • Services
        • Controllers
          • HomeController.cs
        • Views
          • Home
            • Index.cshtml

Den föregående layouten är vanlig när du använder Områden, men endast visningsfilerna krävs för att använda den här mappstrukturen. Visa sökningar efter en matchande vyfil i området i följande ordning:

/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

Associera kontrollanten med ett område

Områdeskontrollanter är avsedda med attributet [Area] :

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();
        }
    }
}

Lägg till områdesväg

Områdesvägar använder vanligtvis konventionell routning i stället för attributroutning. Konventionell routning är orderberoende. I allmänhet bör vägar med områden placeras tidigare i routningstabellen eftersom de är mer specifika än vägar utan område.

{area:...} kan användas som en token i routningsmallar om URL-utrymmet är enhetligt inom alla områden:

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?}");
    });
}

I föregående kod exists tillämpar du en begränsning som vägen måste matcha ett område. Att använda {area:...} är den minst komplicerade mekanismen för att lägga till routning till områden.

Följande kod använder MapAreaRoute för att skapa två namngivna områdesvägar:

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?}");
    });
}

Se MapAreaRoute när du använder med ASP.NET Core 2.2.

Mer information finns i Områdesroutning.

Följande kod från exempelnedladdningen visar länkgenerering med det angivna området:

<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>

Länkarna som genereras med föregående kod är giltiga var som helst i appen.

Exempelnedladdningen innehåller en partiell vy som innehåller föregående länkar och samma länkar utan att ange området. Den partiella vyn refereras till i layoutfilen, så varje sida i appen visar de genererade länkarna. Länkarna som genereras utan att ange området är endast giltiga när de refereras från en sida i samma område och kontrollant.

När området eller styrenheten inte har angetts beror routningen på omgivningsvärdena . De nuvarande ruttvärdena för den aktuella begäran betraktas som omvarande värden för länkgenerering. I många fall för exempelappen genererar användning av omgivande värden felaktiga länkar.

Mer information finns i Routning till kontrollantåtgärder.

Delad layout för områden med hjälp av filen _ViewStart.cshtml

Om du vill dela en gemensam layout för hela appen flyttar du _ViewStart.cshtml till rotmappen för programmet.

_ViewImports.cshtml

På sin standardplats gäller /Views/_ViewImports.cshtml inte för områden. Om du vill använda vanliga Tag Helpers, @using eller @inject i ditt område, ska du kontrollera att en korrekt _ViewImports.cshtml fil gäller för dina områdesvyer. Om du vill ha samma beteende i alla dina vyer, flytta /Views/_ViewImports.cshtml till programroten.

Ändra standardområdesmappen där vyer lagras

Följande kod ändrar standardområdesmappen från "Areas" till "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();
}

Områden med Razor sidor

Områden med Razor sidor kräver en Areas/<area name>/Pages mapp i appens rot. Följande mappstruktur används med exempelappen:

  • Projektnamn
    • Areas
      • Products
        • Pages
          • _ViewImports
          • About
          • Index
      • Services
        • Pages
          • Manage
            • About
            • Index

Följande kod från exempelnedladdningen visar länkgenerering med det angivna området (till exempel 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>

Länkarna som genereras med föregående kod är giltiga var som helst i appen.

Exempelnedladdningen innehåller en partiell vy som innehåller föregående länkar och samma länkar utan att ange området. Den partiella vyn refereras till i layoutfilen, så varje sida i appen visar de genererade länkarna. Länkarna som genereras utan att ange området är endast giltiga när de refereras från en sida i samma område.

När området inte har angetts beror routningen på omgivande värden. De nuvarande ruttvärdena för den aktuella begäran betraktas som omvarande värden för länkgenerering. I många fall för exempelappen genererar användning av omgivande värden felaktiga länkar. Tänk till exempel på länkarna som genereras från följande kod:

<li>
    <a asp-page="/Manage/About">
        Services/Manage/About
    </a>
</li>
<li>
    <a asp-page="/About">
        /About
    </a>
</li>

För föregående kod:

  • Länken som genererades från <a asp-page="/Manage/About"> är endast korrekt när den senaste begäran var för en sida i Services området. Till exempel /Services/Manage/, /Services/Manage/Index, eller /Services/Manage/About.
  • Länken som genererades från <a asp-page="/About"> är endast korrekt när den senaste begäran var för en sida i /Home.
  • Koden är från exempelnedladdningen.

Importera namnområde och tagghjälpmedel med _ViewImports fil

En _ViewImports.cshtml fil kan läggas till i varje område Pages-mapp för att importera namnområdet och Tag Helpers till varje Razor sida i mappen.

Överväg området Tjänster i exempelkoden, som inte innehåller någon _ViewImports.cshtml fil. Följande markering visar sidan /Services/Manage/AboutRazor :

@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RPareas.Areas.Services.Pages.Manage.AboutModel
@{
    ViewData["Title"] = "Srv Mng About";
}

<h2>/Services/Manage/About</h2>

<a asp-area="Products" asp-page="/Index">
    Products/Index
</a>

I föregående markering:

  • Det fullständigt kvalificerade domännamnet måste användas för att ange modellen (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Tag Helpers aktiveras av @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

I exempelnedladdningen innehåller området Produkter följande _ViewImports.cshtml fil:

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

Följande markering visar sidan /Products/AboutRazor :

@page
@model AboutModel
@{
    ViewData["Title"] = "Prod About";
}

<h2>Products/About</h2>

<a asp-area="Services" asp-page="/Manage/About">
    Services/Manage/About
</a>

I föregående fil importeras namnområdet och @addTagHelper direktivet till filen av Areas/Products/Pages/_ViewImports.cshtml filen.

Mer information finns i Hantera tag Helper-omfång och importera delade direktiv.

Delad layout för Razor sidområden

Om du vill dela en gemensam layout för hela appen flyttar du _ViewStart.cshtml till rotmappen för programmet.

Publiceringsområden

Alla *.cshtml-filer och filer i katalogen wwwroot publiceras till utdata när <Project Sdk="Microsoft.NET.Sdk.Web"> inkluderas i filen *.csproj.