Bereiche in ASP.NET CoreAreas in ASP.NET Core

Von Dhananjay Kumar und Rick AndersonBy Dhananjay Kumar and Rick Anderson

Bereiche sind eine ASP.net-Funktion, die verwendet wird, um verwandte Funktionen in einer Gruppe als separate zu organisieren:Areas are an ASP.NET feature used to organize related functionality into a group as a separate:

  • Namespace für das Routing.Namespace for routing.
  • Ordnerstruktur für Sichten und Razor Seiten.Folder structure for views and Razor Pages.

Mithilfe von Bereichen wird eine Hierarchie für das Routing erstellt, indem ein weiterer Routen Parameter, area , zu controller und action oder einer Razor Seite hinzugefügt wird page .Using areas creates a hierarchy for the purpose of routing by adding another route parameter, area, to controller and action or a Razor Page page.

Bereiche bieten eine Möglichkeit, eine ASP.net Core-Web-App in kleinere funktionale Gruppen zu partitionieren, die jeweils über einen eigenen Satz von Razor Seiten, Controllern, Ansichten und Modellen verfügen.Areas provide a way to partition an ASP.NET Core Web app into smaller functional groups, each with its own set of Razor Pages, controllers, views, and models. Ein Bereich ist im Grunde genommen eine Struktur in einer App.An area is effectively a structure inside an app. In einem ASP.NET Core-Webprojekt werden logische Komponenten wie Seiten, Modelle, Controller und Ansichten in verschiedenen Ordner aufbewahrt.In an ASP.NET Core web project, logical components like Pages, Model, Controller, and View are kept in different folders. Die ASP.NET Core-Runtime verwendet Namenskonventionen, um die Beziehung zwischen diesen Komponenten zu erstellen.The ASP.NET Core runtime uses naming conventions to create the relationship between these components. Bei einer großen App kann es von Vorteil sein, die App in mehrere Bereiche mit hoher Funktionalität aufzuteilen.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Dies gilt z.B. für eine E-Commerce-App mit mehreren Geschäftseinheiten, wie Auftragsabschluss, Abrechnung und Suche.For instance, an e-commerce app with multiple business units, such as checkout, billing, and search. Jede dieser Einheiten verfügt über einen eigenen Bereich, der Sichten, Controller, Razor Seiten und Modelle enthalten soll.Each of these units have their own area to contain views, controllers, Razor Pages, and models.

Die Verwendung von Bereichen in einem Projekt ist erwägenswert, wenn:Consider using Areas in a project when:

  • Ihre App aus mehreren funktionalen Komponenten auf hoher Ebene besteht, die logisch getrennt sein können.The app is made of multiple high-level functional components that can be logically separated.
  • Sie Ihre App partitionieren möchten, damit jeder funktionale Bereich unabhängig voneinander bearbeitet werden kann.You want to partition the app so that each functional area can be worked on independently.

Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).View or download sample code (how to download). Das Downloadbeispiel stellt eine einfache App für Testbereiche zur Verfügung.The download sample provides a basic app for testing areas.

Wenn Sie Seiten verwenden Razor , finden Sie weitere Informationen unter Bereiche mit Razor Seiten in diesem Dokument.If you're using Razor Pages, see Areas with Razor Pages in this document.

Bereiche für Controller mit AnsichtenAreas for controllers with views

Eine typische ASP.NET Core-Web-App, die Bereiche, Controller und Ansichten verwendet, beinhaltet Folgendes:A typical ASP.NET Core web app using areas, controllers, and views contains the following:

BereichsordnerstrukturArea folder structure

Stellen Sie sich eine App vor, die zwei logische Gruppen hat, Produkte und Dienste.Consider an app that has two logical groups, Products and Services. Wenn Bereiche verwendet werden, würde die Ordnerstruktur ähnlich dem Folgenden aussehen:Using areas, the folder structure would be similar to the following:

  • ProjektnameProject name
    • BereicheAreas
      • ProdukteProducts
        • ControllersControllers
          • HomeController.csHomeController.cs
          • ManageController.csManageController.cs
        • SichtenViews
          • -StartseiteHome
            • Index.cshtmlIndex.cshtml
          • VerwaltenManage
            • Index.cshtmlIndex.cshtml
            • About.cshtmlAbout.cshtml
      • DiensteServices
        • ControllersControllers
          • HomeController.csHomeController.cs
        • SichtenViews
          • -StartseiteHome
            • Index.cshtmlIndex.cshtml

Während das vorherige Layout typisch ist, wenn Bereiche verwendet werden, müssen nur die Ansichtsdateien diese Ordnerstruktur verwenden.While the preceding layout is typical when using Areas, only the view files are required to use this folder structure. Die Ansichtsermittlung sucht nach einer passenden Bereichsansichtsdatei im folgenden Ordner:View discovery searches for a matching area view file in the following order:

/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

Zuordnen eines Controllers zu einem BereichAssociate the controller with an Area

Bereichs Controller werden mit dem [ Area ] -Attribut angegeben:Area controllers are designated with the [Area] attribute:

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

Hinzufügen einer BereichsrouteAdd Area route

Bereichs Routen verwenden normalerweise herkömmliches Routing anstelle von Attribut Routing.Area routes typically use conventional routing rather than attribute routing. Beim herkömmlichen Routing ist die Reihenfolge wichtig.Conventional routing is order-dependent. Routen mit Bereichen werden im Allgemeinen früher in der Routentabelle aufgeführt als die spezifischeren Routen ohne Bereich.In general, routes with areas should be placed earlier in the route table as they're more specific than routes without an area.

{area:...} kann als Token in Routenvorlagen verwendet werden, wenn der URL-Raum in allen Bereichen einheitlich ist:{area:...} can be used as a token in route templates if url space is uniform across all areas:

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

Im vorherigen Code wendet exists eine Einschränkung an: Die Route muss mit einem Bereich übereinstimmen.In the preceding code, exists applies a constraint that the route must match an area. Verwenden {area:...} mit MapControllerRoute :Using {area:...} with MapControllerRoute:

  • Ist der am wenigsten komplizierte Mechanismus zum Hinzufügen von Routing zu Bereichen.Is the least complicated mechanism to adding routing to areas.
  • Entspricht allen Controllern mit dem- [Area("Area name")] Attribut.Matches all controllers with the [Area("Area name")] attribute.

Im folgenden Code wird MapAreaControllerRoute verwendet, um zwei benannte Bereichsrouten zu erstellen:The following code uses MapAreaControllerRoute to create two named area routes:

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

Weitere Informationen finden Sie im Artikel Routing zu Controlleraktionen in ASP.NET Core.For more information, see Area routing.

Im folgenden Code aus dem Beispieldownload sehen Sie die Erstellung eines Links mit dem angegebenen Bereich:The following code from the sample download shows link generation with the area specified:

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

Der Beispiel Download umfasst eine partielle Sicht , die Folgendes enthält:The sample download includes a partial view that contains:

  • Die vorangehenden Links.The preceding links.
  • Links, die mit dem vorangehenden vergleichbar sind, außer area sind nicht angegeben.Links similar to the preceding except area is not specified.

In der Layoutdatei wird auf die partielle Ansicht verwiesen. Jede Seite in der App stellt also die erstellen Links dar.The partial view is referenced in the layout file, so every page in the app displays the generated links. Die Links, die ohne Angabe eines Bereichs erstellt werden, sind nur gültig, wenn auf sie von einer Seite im selben Bereich und Controller verwiesen wird.The links generated without specifying the area are only valid when referenced from a page in the same area and controller.

Wenn der Bereich oder der Kontroller nicht angegeben werden, hängt das Routing von den Umgebungswerten ab.When the area or controller is not specified, routing depends on the ambient values. Die aktuellen Routenwerte der aktuellen Anforderung werden bei der Linkgenerierung als Umgebungswerte behandelt.The current route values of the current request are considered ambient values for link generation. In vielen Fällen für die Beispiel-App generiert die Verwendung der Ambient-Werte falsche Verknüpfungen mit dem Markup, das nicht den Bereich angibt.In many cases for the sample app, using the ambient values generates incorrect links with the markup that doesn't specify the area.

Weitere Informationen finden Sie unter Routing zu Controlleraktionen in ASP.NET Core.For more information, see Routing to controller actions.

Freigegebenes Layout für Bereiche unter Verwendung der _ViewStart.cshtml-DateiShared layout for Areas using the _ViewStart.cshtml file

Wenn Sie ein gemeinsames Layout für die gesamte App freigeben möchten, behalten Sie die _ViewStart. cshtml im Stamm Ordner der Anwendungbei.To share a common layout for the entire app, keep the _ViewStart.cshtml in the application root folder. Weitere Informationen finden Sie unter Layout in ASP.NET Core.For more information, see Layout in ASP.NET Core

Anwendungs Stamm OrdnerApplication root folder

Der Stamm Ordner der Anwendung ist der Ordner, der Startup.cs in Web-App enthält, die mit den ASP.net Core Vorlagen erstellt wurde.The application root folder is the folder containing Startup.cs in web app created with the ASP.NET Core templates.

_ViewImports.cshtml_ViewImports.cshtml

/Views/_ViewImports. cshtml, for MVC und /pages/_ViewImports. cshtml für Razor Seiten, wird nicht in Ansichten in Bereichen importiert./Views/_ViewImports.cshtml, for MVC, and /Pages/_ViewImports.cshtml for Razor Pages, is not imported to views in areas. Verwenden Sie einen der folgenden Ansätze, um Ansichts Importe für alle Sichten bereitzustellen:Use one of the following approaches to provide view imports to all views:

  • Fügen Sie _ViewImports. cshtml dem Anwendungs Stamm Ordnerhinzu.Add _ViewImports.cshtml to the application root folder. Eine _ViewImports. cshtml -Datei im Stamm Ordner der Anwendung gilt für alle Sichten in der app.A _ViewImports.cshtml in the application root folder will apply to all views in the app.
  • Kopieren Sie die Datei _ViewImports. cshtml in den entsprechenden Ansichts Ordner Unterbereiche.Copy the _ViewImports.cshtml file to the appropriate view folder under areas.

Die Datei _ViewImports. cshtml enthält normalerweise taghilfsprogramme , die @using - @inject Anweisungen, und.The _ViewImports.cshtml file typically contains Tag Helpers imports, @using, and @inject statements. Weitere Informationen finden Sie unter Importieren von freigegebenen Direktiven.For more information, see Importing Shared Directives.

Ändern des Standardbereichsordners, in dem Ansichten gespeichert sindChange default area folder where views are stored

Der folgende Code ändert den Standardbereichsordner von "Areas" in "MyAreas":The following code changes the default area folder from "Areas" to "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();
}

Bereiche mit Razor SeitenAreas with Razor Pages

Bereiche mit Razor Seiten erfordern einen Areas/<area name>/Pages Ordner im Stamm der app.Areas with Razor Pages require an Areas/<area name>/Pages folder in the root of the app. Die folgende Ordnerstruktur wird mit dem Beispiel-App verwendet.The following folder structure is used with the sample app:

  • ProjektnameProject name
    • BereicheAreas
      • ProdukteProducts
        • SeitenPages
          • _ViewImports_ViewImports
          • InfoAbout
          • IndexIndex
      • DiensteServices
        • SeitenPages
          • VerwaltenManage
            • InfoAbout
            • IndexIndex

Im folgenden Code aus dem Beispieldownload sehen Sie die Erstellung eines Links mit dem angegebenen Bereich (z.B. asp-area="Products"):The following code from the sample download shows link generation with the area specified (for example, 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>

Im Beispieldownload ist eine partielle Ansicht enthalten, die die vorherigen Links und dieselben Links beinhaltet, ohne dass der Bereich angegeben wird.The sample download includes a partial view that contains the preceding links and the same links without specifying the area. In der Layoutdatei wird auf die partielle Ansicht verwiesen. Jede Seite in der App stellt also die erstellen Links dar.The partial view is referenced in the layout file, so every page in the app displays the generated links. Die Links, die ohne Angabe eines Bereichs erstellt werden, sind nur gültig, wenn auf sie von einer Seite im selben Bereich verwiesen wird.The links generated without specifying the area are only valid when referenced from a page in the same area.

Wenn der Bereich nicht angegeben wird, hängt das Routing von den Umgebungswerten ab.When the area is not specified, routing depends on the ambient values. Die aktuellen Routenwerte der aktuellen Anforderung werden bei der Linkgenerierung als Umgebungswerte behandelt.The current route values of the current request are considered ambient values for link generation. Oft werden ungültige Links erstellt, wenn für die Beispiel-App die Umgebungswerte verwendet werden.In many cases for the sample app, using the ambient values generates incorrect links. Betrachten Sie hierzu die aus dem folgenden Code generierten Links:For example, consider the links generated from the following code:

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

Für den Code oben gilt:For the preceding code:

  • Der aus <a asp-page="/Manage/About"> generierte Link stimmt nur, wenn die letzte Anforderung für eine Seite im Services-Bereich erfolgte.The link generated from <a asp-page="/Manage/About"> is correct only when the last request was for a page in Services area. Beispiel: /Services/Manage/, /Services/Manage/Index oder /Services/Manage/About.For example, /Services/Manage/, /Services/Manage/Index, or /Services/Manage/About.
  • Der aus <a asp-page="/About"> generierte Link stimmt nur, wenn die letzte Anforderung für eine Seite in /Home erfolgte.The link generated from <a asp-page="/About"> is correct only when the last request was for a page in /Home.
  • Der Code stammt aus dem Beispieldownload.The code is from the sample download.

Importieren von Namespace und Taghilfsprogrammen mit der _ViewImports-DateiImport namespace and Tag Helpers with _ViewImports file

Eine _ViewImports. cshtml -Datei kann jedem Ordner der Bereichs Seiten hinzugefügt werden, um die Namespace-und taghilfsprogramme auf jede Razor Seite im Ordner zu importieren.A _ViewImports.cshtml file can be added to each area Pages folder to import the namespace and Tag Helpers to each Razor Page in the folder.

Betrachten Sie den Bereich Services des Beispielcodes, der keine _ViewImports.cshtml-Datei enthält.Consider the Services area of the sample code, which doesn't contain a _ViewImports.cshtml file. Das folgende Markup zeigt die /Services/Manage/about - Razor Seite an:The following markup shows the /Services/Manage/About Razor Page:

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

Im obenstehenden Markup:In the preceding markup:

  • Der vollqualifizierte Domänenname muss verwendet werden, um das Modell anzugeben (@model RPareas.Areas.Services.Pages.Manage.AboutModel).The fully qualified domain name must be used to specify the model (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Taghilfsprogramme werden aktiviert durch@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpersTag Helpers are enabled by @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Im Beispieldownload enthält der Bereich „Products“ die folgende _ViewImports.cshtml-Datei:In the sample download, the Products area contains the following _ViewImports.cshtml file:

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

Das folgende Markup zeigt die /Products/about - Razor Seite an:The following markup shows the /Products/About Razor Page:

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

In der vorherigen Datei werden Namespace und @addTagHelper-Anweisung von der Datei Areas/Products/Pages/_ViewImports.cshtml in die Datei importiert.In the preceding file, the namespace and @addTagHelper directive is imported to the file by the Areas/Products/Pages/_ViewImports.cshtml file.

Weitere Informationen finden Sie unter Verwalten des Taghilfsprogrammbereichs und Importieren gemeinsam verwendeter Anweisungen.For more information, see Managing Tag Helper scope and Importing Shared Directives.

Frei gegebenes Layout für Razor SeitenbereicheShared layout for Razor Pages Areas

Um ein gemeinsames Layout für die gesamte App freizugeben, verschieben Sie _ViewStart.cshtml in den Stammordner der Anwendung.To share a common layout for the entire app, move the _ViewStart.cshtml to the application root folder.

Veröffentlichen von BereichenPublishing Areas

Alle *.cshtml-Dateien und Dateien im wwwroot-Verzeichnis werden in der Ausgabe veröffentlicht, wenn <Project Sdk="Microsoft.NET.Sdk.Web"> in der *.csproj-Datei enthalten ist.All *.cshtml files and files within the wwwroot directory are published to output when <Project Sdk="Microsoft.NET.Sdk.Web"> is included in the *.csproj file.

Bereiche sind ein Feature von ASP.NET, das für die Organisation von verwandten Funktionalitäten in eine Gruppe als separater Namespace (für Routing) und Ordnerstruktur (für Ansichten) verwendet wird.Areas are an ASP.NET feature used to organize related functionality into a group as a separate namespace (for routing) and folder structure (for views). Mithilfe von Bereichen wird eine Hierarchie für das Routing erstellt, indem ein weiterer Routen Parameter, area , zu controller und action oder einer Razor Seite hinzugefügt wird page .Using areas creates a hierarchy for the purpose of routing by adding another route parameter, area, to controller and action or a Razor Page page.

Bereiche bieten eine Möglichkeit, eine ASP.net Core-Web-App in kleinere funktionale Gruppen zu partitionieren, die jeweils über einen eigenen Satz von Razor Seiten, Controllern, Ansichten und Modellen verfügen.Areas provide a way to partition an ASP.NET Core Web app into smaller functional groups, each with its own set of Razor Pages, controllers, views, and models. Ein Bereich ist im Grunde genommen eine Struktur in einer App.An area is effectively a structure inside an app. In einem ASP.NET Core-Webprojekt werden logische Komponenten wie Seiten, Modelle, Controller und Ansichten in verschiedenen Ordner aufbewahrt.In an ASP.NET Core web project, logical components like Pages, Model, Controller, and View are kept in different folders. Die ASP.NET Core-Runtime verwendet Namenskonventionen, um die Beziehung zwischen diesen Komponenten zu erstellen.The ASP.NET Core runtime uses naming conventions to create the relationship between these components. Bei einer großen App kann es von Vorteil sein, die App in mehrere Bereiche mit hoher Funktionalität aufzuteilen.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Dies gilt z.B. für eine E-Commerce-App mit mehreren Geschäftseinheiten, wie Auftragsabschluss, Abrechnung und Suche.For instance, an e-commerce app with multiple business units, such as checkout, billing, and search. Jede dieser Einheiten verfügt über einen eigenen Bereich, der Sichten, Controller, Razor Seiten und Modelle enthalten soll.Each of these units have their own area to contain views, controllers, Razor Pages, and models.

Die Verwendung von Bereichen in einem Projekt ist erwägenswert, wenn:Consider using Areas in a project when:

  • Ihre App aus mehreren funktionalen Komponenten auf hoher Ebene besteht, die logisch getrennt sein können.The app is made of multiple high-level functional components that can be logically separated.
  • Sie Ihre App partitionieren möchten, damit jeder funktionale Bereich unabhängig voneinander bearbeitet werden kann.You want to partition the app so that each functional area can be worked on independently.

Zeigen Sie Beispielcode an, oder laden Sie diesen herunter (Vorgehensweise zum Herunterladen).View or download sample code (how to download). Das Downloadbeispiel stellt eine einfache App für Testbereiche zur Verfügung.The download sample provides a basic app for testing areas.

Wenn Sie Seiten verwenden Razor , finden Sie weitere Informationen unter Bereiche mit Razor Seiten in diesem Dokument.If you're using Razor Pages, see Areas with Razor Pages in this document.

Bereiche für Controller mit AnsichtenAreas for controllers with views

Eine typische ASP.NET Core-Web-App, die Bereiche, Controller und Ansichten verwendet, beinhaltet Folgendes:A typical ASP.NET Core web app using areas, controllers, and views contains the following:

BereichsordnerstrukturArea folder structure

Stellen Sie sich eine App vor, die zwei logische Gruppen hat, Produkte und Dienste.Consider an app that has two logical groups, Products and Services. Wenn Bereiche verwendet werden, würde die Ordnerstruktur ähnlich dem Folgenden aussehen:Using areas, the folder structure would be similar to the following:

  • ProjektnameProject name
    • BereicheAreas
      • ProdukteProducts
        • ControllersControllers
          • HomeController.csHomeController.cs
          • ManageController.csManageController.cs
        • SichtenViews
          • -StartseiteHome
            • Index.cshtmlIndex.cshtml
          • VerwaltenManage
            • Index.cshtmlIndex.cshtml
            • About.cshtmlAbout.cshtml
      • DiensteServices
        • ControllersControllers
          • HomeController.csHomeController.cs
        • SichtenViews
          • -StartseiteHome
            • Index.cshtmlIndex.cshtml

Während das vorherige Layout typisch ist, wenn Bereiche verwendet werden, müssen nur die Ansichtsdateien diese Ordnerstruktur verwenden.While the preceding layout is typical when using Areas, only the view files are required to use this folder structure. Die Ansichtsermittlung sucht nach einer passenden Bereichsansichtsdatei im folgenden Ordner:View discovery searches for a matching area view file in the following order:

/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

Zuordnen eines Controllers zu einem BereichAssociate the controller with an Area

Bereichs Controller werden mit dem [ Area ] -Attribut angegeben:Area controllers are designated with the [Area] attribute:

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

Hinzufügen einer BereichsrouteAdd Area route

Bereichsrouten verwenden normalerweise konventionelles Routing anstatt Attributrouting.Area routes typically use conventional routing rather than attribute routing. Beim herkömmlichen Routing ist die Reihenfolge wichtig.Conventional routing is order-dependent. Routen mit Bereichen werden im Allgemeinen früher in der Routentabelle aufgeführt als die spezifischeren Routen ohne Bereich.In general, routes with areas should be placed earlier in the route table as they're more specific than routes without an area.

{area:...} kann als Token in Routenvorlagen verwendet werden, wenn der URL-Raum in allen Bereichen einheitlich ist:{area:...} can be used as a token in route templates if url space is uniform across all areas:

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

Im vorherigen Code wendet exists eine Einschränkung an: Die Route muss mit einem Bereich übereinstimmen.In the preceding code, exists applies a constraint that the route must match an area. {area:...} zu verwenden ist die unkomplizierteste Methode, um Bereichen Routing hinzuzufügen.Using {area:...} is the least complicated mechanism to adding routing to areas.

Im folgenden Code wird MapAreaRoute verwendet, um zwei benannte Bereichsrouten zu erstellen:The following code uses MapAreaRoute to create two named area routes:

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

Wenn MapAreaRoute mit ASP.NET Core 2.2 verwendet werden soll, sehen Sie sich diesen GitHub-Artikel an.When using MapAreaRoute with ASP.NET Core 2.2, see this GitHub issue.

Weitere Informationen finden Sie im Artikel Routing zu Controlleraktionen in ASP.NET Core.For more information, see Area routing.

Im folgenden Code aus dem Beispieldownload sehen Sie die Erstellung eines Links mit dem angegebenen Bereich:The following code from the sample download shows link generation with the area specified:

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

Links, die mit dem vorherigen Code erstellt wurden, gelten überall in der App.The links generated with the preceding code are valid anywhere in the app.

Im Beispieldownload ist eine partielle Ansicht enthalten, die die vorherigen Links und dieselben Links beinhaltet, ohne dass der Bereich angegeben wird.The sample download includes a partial view that contains the preceding links and the same links without specifying the area. In der Layoutdatei wird auf die partielle Ansicht verwiesen. Jede Seite in der App stellt also die erstellen Links dar.The partial view is referenced in the layout file, so every page in the app displays the generated links. Die Links, die ohne Angabe eines Bereichs erstellt werden, sind nur gültig, wenn auf sie von einer Seite im selben Bereich und Controller verwiesen wird.The links generated without specifying the area are only valid when referenced from a page in the same area and controller.

Wenn der Bereich oder der Kontroller nicht angegeben werden, hängt das Routing von den Umgebungswerten ab.When the area or controller is not specified, routing depends on the ambient values. Die aktuellen Routenwerte der aktuellen Anforderung werden bei der Linkgenerierung als Umgebungswerte behandelt.The current route values of the current request are considered ambient values for link generation. Oft werden ungültige Links erstellt, wenn für die Beispiel-App die Umgebungswerte verwendet werden.In many cases for the sample app, using the ambient values generates incorrect links.

Weitere Informationen finden Sie unter Routing zu Controlleraktionen in ASP.NET Core.For more information, see Routing to controller actions.

Freigegebenes Layout für Bereiche unter Verwendung der _ViewStart.cshtml-DateiShared layout for Areas using the _ViewStart.cshtml file

Um ein gemeinsames Layout für die gesamte App freizugeben, verschieben Sie _ViewStart.cshtml in den Stammordner der Anwendung.To share a common layout for the entire app, move the _ViewStart.cshtml to the application root folder.

_ViewImports.cshtml_ViewImports.cshtml

An ihrem Standardspeicherort gilt die Datei /Views/_ViewImports.cshtml nicht für Bereiche.In its standard location, /Views/_ViewImports.cshtml doesn't apply to areas. Um allgemeine taghilfsprogramme, @using oder @inject in Ihrer Region zu verwenden, stellen Sie sicher, dass eine ordnungsgemäße _ViewImports. cshtml -Datei für Ihre Bereichs Ansichten gilt.To use common Tag Helpers, @using, or @inject in your area, ensure a proper _ViewImports.cshtml file applies to your area views. Wenn Sie das gleiche Verhalten in allen Ansichten wünschen, verschieben Sie /Views/_ViewImports.cshtml in den Anwendungsstamm.If you want the same behavior in all your views, move /Views/_ViewImports.cshtml to the application root.

Ändern des Standardbereichsordners, in dem Ansichten gespeichert sindChange default area folder where views are stored

Der folgende Code ändert den Standardbereichsordner von "Areas" in "MyAreas":The following code changes the default area folder from "Areas" to "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();
}

Bereiche mit Razor SeitenAreas with Razor Pages

Bereiche mit Razor Seiten erfordern einen Areas/<area name>/Pages Ordner im Stamm der app.Areas with Razor Pages require an Areas/<area name>/Pages folder in the root of the app. Die folgende Ordnerstruktur wird mit dem Beispiel-App verwendet.The following folder structure is used with the sample app:

  • ProjektnameProject name
    • BereicheAreas
      • ProdukteProducts
        • SeitenPages
          • _ViewImports_ViewImports
          • InfoAbout
          • IndexIndex
      • DiensteServices
        • SeitenPages
          • VerwaltenManage
            • InfoAbout
            • IndexIndex

Im folgenden Code aus dem Beispieldownload sehen Sie die Erstellung eines Links mit dem angegebenen Bereich (z.B. asp-area="Products"):The following code from the sample download shows link generation with the area specified (for example, 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>

Links, die mit dem vorherigen Code erstellt wurden, gelten überall in der App.The links generated with the preceding code are valid anywhere in the app.

Im Beispieldownload ist eine partielle Ansicht enthalten, die die vorherigen Links und dieselben Links beinhaltet, ohne dass der Bereich angegeben wird.The sample download includes a partial view that contains the preceding links and the same links without specifying the area. In der Layoutdatei wird auf die partielle Ansicht verwiesen. Jede Seite in der App stellt also die erstellen Links dar.The partial view is referenced in the layout file, so every page in the app displays the generated links. Die Links, die ohne Angabe eines Bereichs erstellt werden, sind nur gültig, wenn auf sie von einer Seite im selben Bereich verwiesen wird.The links generated without specifying the area are only valid when referenced from a page in the same area.

Wenn der Bereich nicht angegeben wird, hängt das Routing von den Umgebungswerten ab.When the area is not specified, routing depends on the ambient values. Die aktuellen Routenwerte der aktuellen Anforderung werden bei der Linkgenerierung als Umgebungswerte behandelt.The current route values of the current request are considered ambient values for link generation. Oft werden ungültige Links erstellt, wenn für die Beispiel-App die Umgebungswerte verwendet werden.In many cases for the sample app, using the ambient values generates incorrect links. Betrachten Sie hierzu die aus dem folgenden Code generierten Links:For example, consider the links generated from the following code:

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

Für den Code oben gilt:For the preceding code:

  • Der aus <a asp-page="/Manage/About"> generierte Link stimmt nur, wenn die letzte Anforderung für eine Seite im Services-Bereich erfolgte.The link generated from <a asp-page="/Manage/About"> is correct only when the last request was for a page in Services area. Beispiel: /Services/Manage/, /Services/Manage/Index oder /Services/Manage/About.For example, /Services/Manage/, /Services/Manage/Index, or /Services/Manage/About.
  • Der aus <a asp-page="/About"> generierte Link stimmt nur, wenn die letzte Anforderung für eine Seite in /Home erfolgte.The link generated from <a asp-page="/About"> is correct only when the last request was for a page in /Home.
  • Der Code stammt aus dem Beispieldownload.The code is from the sample download.

Importieren von Namespace und Taghilfsprogrammen mit der _ViewImports-DateiImport namespace and Tag Helpers with _ViewImports file

Eine _ViewImports. cshtml -Datei kann jedem Ordner der Bereichs Seiten hinzugefügt werden, um die Namespace-und taghilfsprogramme auf jede Razor Seite im Ordner zu importieren.A _ViewImports.cshtml file can be added to each area Pages folder to import the namespace and Tag Helpers to each Razor Page in the folder.

Betrachten Sie den Bereich Services des Beispielcodes, der keine _ViewImports.cshtml-Datei enthält.Consider the Services area of the sample code, which doesn't contain a _ViewImports.cshtml file. Das folgende Markup zeigt die /Services/Manage/about - Razor Seite an:The following markup shows the /Services/Manage/About Razor Page:

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

Im obenstehenden Markup:In the preceding markup:

  • Der vollqualifizierte Domänenname muss verwendet werden, um das Modell anzugeben (@model RPareas.Areas.Services.Pages.Manage.AboutModel).The fully qualified domain name must be used to specify the model (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Taghilfsprogramme werden aktiviert durch@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpersTag Helpers are enabled by @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Im Beispieldownload enthält der Bereich „Products“ die folgende _ViewImports.cshtml-Datei:In the sample download, the Products area contains the following _ViewImports.cshtml file:

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

Das folgende Markup zeigt die /Products/about - Razor Seite an:The following markup shows the /Products/About Razor Page:

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

<h2>Products/About</h2>

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

In der vorherigen Datei werden Namespace und @addTagHelper-Anweisung von der Datei Areas/Products/Pages/_ViewImports.cshtml in die Datei importiert.In the preceding file, the namespace and @addTagHelper directive is imported to the file by the Areas/Products/Pages/_ViewImports.cshtml file.

Weitere Informationen finden Sie unter Verwalten des Taghilfsprogrammbereichs und Importieren gemeinsam verwendeter Anweisungen.For more information, see Managing Tag Helper scope and Importing Shared Directives.

Frei gegebenes Layout für Razor SeitenbereicheShared layout for Razor Pages Areas

Um ein gemeinsames Layout für die gesamte App freizugeben, verschieben Sie _ViewStart.cshtml in den Stammordner der Anwendung.To share a common layout for the entire app, move the _ViewStart.cshtml to the application root folder.

Veröffentlichen von BereichenPublishing Areas

Alle *.cshtml-Dateien und Dateien im wwwroot-Verzeichnis werden in der Ausgabe veröffentlicht, wenn <Project Sdk="Microsoft.NET.Sdk.Web"> in der *.csproj-Datei enthalten ist.All *.cshtml files and files within the wwwroot directory are published to output when <Project Sdk="Microsoft.NET.Sdk.Web"> is included in the *.csproj file.