Sdílet prostřednictvím


Oblasti v ASP.NET Core

Dhananjay Kumar a Rick Anderson

Oblasti jsou funkce ASP.NET sloužící k uspořádání souvisejících funkcí do skupiny jako samostatné:

  • Obor názvů pro směrování
  • Struktura složek pro zobrazení a Razor stránky

Použití oblastí vytvoří hierarchii pro účely směrování přidáním dalšího parametru trasy , areado controller a action nebo Razor stránky page.

Oblasti poskytují způsob, jak rozdělit webovou aplikaci ASP.NET Core do menších funkčních skupin, z nichž každá má vlastní sadu Razor stránek, kontrolerů, zobrazení a modelů. Oblast je v podstatě struktura uvnitř aplikace. Ve webovém projektu ASP.NET Core se logické komponenty, jako jsou Pages, Model, Controller a View, uchovávají v různých složkách. Modul runtime ASP.NET Core používá zásady vytváření názvů k vytvoření vztahu mezi těmito komponentami. U velké aplikace může být výhodné rozdělit aplikaci do samostatných oblastí funkčnosti vysoké úrovně. Například aplikace elektronického obchodování s několika obchodními jednotkami, jako je pokladna, fakturace a vyhledávání. Každá z těchto jednotek má vlastní oblast, která obsahuje zobrazení, kontrolery, Razor stránky a modely.

Zvažte použití oblastí v projektu v následujících případech:

  • Aplikace je tvořená několika funkčními komponentami vysoké úrovně, které je možné logicky oddělit.
  • Chcete rozdělit aplikaci tak, aby každá funkční oblast fungovala nezávisle na sobě.

Pokud používáte Razor stránky, přečtěte si téma Oblasti se stránkami Razor v tomto dokumentu.

Oblasti pro kontrolery se zobrazeními

Typická webová aplikace ASP.NET Core, která používá oblasti, kontrolery a zobrazení, obsahuje následující:

  • Struktura složek Oblasti.

  • Kontrolery s atributem [Area] pro přidružení kontroleru k oblasti:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Trasa oblasti přidaná do 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();
    

Struktura složek oblasti

Představte si aplikaci, která má dvě logické skupiny, produkty a služby. Struktura složek by se při použití oblastí podobala následujícímu:

  • Název projektu
    • Oblastech
      • Produkty
        • Řadiče
          • HomeController.cs
          • ManageController.cs
        • Zobrazení
          • Home
            • Soubor Index.cshtml
          • Spravovat
            • Soubor Index.cshtml
            • About.cshtml
      • Služby
        • Řadiče
          • HomeController.cs
        • Zobrazení
          • Home
            • Soubor Index.cshtml

Zatímco předchozí rozložení je typické při použití oblastí, k použití této struktury složek se vyžadují pouze soubory zobrazení. Zobrazení vyhledávání hledá odpovídající soubor zobrazení oblasti v následujícím pořadí:

/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

Přidružení kontroleru k oblasti

Řadiče oblastí jsou označené atributem [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();
    }
}

Přidat trasu oblasti

Trasy oblastí obvykle používají konvenční směrování místo směrování atributů. Konvenční směrování je závislé na pořadí. Obecně platí, že trasy s oblastmi by měly být umístěny dříve v směrovací tabulce, protože jsou konkrétnější než trasy bez oblasti.

{area:...} lze použít jako token v šablonách tras, pokud je prostor adres URL jednotný ve všech oblastech:

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

V předchozím kódu použije omezení, exists které musí trasa shodovat s oblastí. Použití s {area:...}MapControllerRoute:

  • Je nejméně komplikovaný mechanismus přidávání směrování do oblastí.
  • Odpovídá všem kontrolerům s atributem [Area("Area name")] .

Následující kód používá MapAreaControllerRoute k vytvoření dvou pojmenovaných tras oblasti:

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

Další informace naleznete v tématu Směrování oblasti.

Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí:

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

Stažení ukázky zahrnuje částečné zobrazení , které obsahuje:

  • Předchozí odkazy.
  • Odkazy podobné předchozímu s výjimkou area nejsou zadány.

Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti a kontroleru.

Pokud není zadána oblast nebo kontroler, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy s kódem, který neurčuje oblast.

Další informace naleznete v tématu Směrování na akce kontroleru.

Sdílené rozložení oblastí pomocí souboru _ViewStart.cshtml

Pokud chcete sdílet společné rozložení pro celou aplikaci, ponechte soubor _ViewStart.cshtml v kořenové složce aplikace. Další informace najdete v tématu Rozložení v ASP.NET Core

Kořenová složka aplikace

Kořenová složka aplikace je složka obsahující Program.cs soubor ve webové aplikaci vytvořené pomocí šablon ASP.NET Core.

_ViewImports.cshtml

/Views/_ViewImports.cshtml, pro MVC a /Pages/_ViewImports.cshtml pro Razor Stránky, se neimportuje do zobrazení v oblastech. Pomocí jednoho z následujících přístupů můžete zobrazit importy do všech zobrazení:

  • Do kořenové složky aplikace přidejte soubor _ViewImports.cshtml. Soubor _ViewImports.cshtml v kořenové složce aplikace se použije pro všechna zobrazení v aplikaci.
  • Zkopírujte soubor _ViewImports.cshtml do příslušné složky zobrazení v oblastech. Aplikace Pages vytvořená pomocí jednotlivých uživatelských účtů má například Razor soubor _ViewImports.cshtml v následujících složkách:
    • /Areas//IdentityPages/_ViewImports.cshtml
    • /Pages/_ViewImports.cshtml

Soubor _ViewImports.cshtml obvykle obsahuje importy @usingpomocných rutin značek a @inject příkazy. Další informace naleznete v tématu Import sdílených direktiv.

Změna výchozí složky oblasti, ve které jsou uložená zobrazení

Následující kód změní výchozí složku oblasti z"Areas":"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();

Oblasti se stránkami Razor

Oblasti se stránkami Razor vyžadují Areas/<area name>/Pages složku v kořenovém adresáři aplikace. V ukázkové aplikaci se používá následující struktura složek:

  • Název projektu
    • Oblastech
      • Produkty
        • Stránky
          • _ViewImports
          • O uživateli
          • Index
      • Služby
        • Stránky
          • Spravovat
            • O uživateli
            • Index

Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí (například 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>

Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti.

Pokud oblast není zadána, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy. Představte si například odkazy vygenerované z následujícího kódu:

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

Pro předchozí kód:

  • Odkaz vygenerovaný z <a asp-page="/Manage/About"> je správný pouze v případě, že poslední žádost byla pro stránku v Services oblasti. Například , /Services/Manage/, /Services/Manage/Indexnebo /Services/Manage/About.
  • Odkaz vygenerovaný z <a asp-page="/About"> je správný pouze v případě, že poslední požadavek byl pro stránku v /Home.
  • Kód pochází z ukázkového stažení.

Import pomocných rutin oboru názvů a značek pomocí souboru _ViewImports

Do každé složky Stránky oblasti lze přidat soubor _ViewImports.cshtml, který naimportuje obor názvů a pomocné rutiny značek do každé Razor stránky ve složce.

Vezměte v úvahu oblast Služby ukázkového kódu, která neobsahuje soubor _ViewImports.cshtml . Následující kód ukazuje stránku /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>

V předchozím kódu:

  • Plně kvalifikovaný název třídy se musí použít k určení modelu (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Pomocné rutiny značek jsou povoleny @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

V ukázkovém stažení obsahuje oblast Products následující soubor _ViewImports.cshtml :

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

Následující kód ukazuje stránku /Products/AboutRazor:

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

V předchozím souboru se obor názvů a @addTagHelper direktiva importují do souboru pomocí souboru Areas/Products/Pages/_ViewImports.cshtml .

Další informace naleznete v tématu Správa oboru pomocné rutiny značek a import sdílených direktiv.

Sdílené rozložení pro Razor oblasti stránek

Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte soubor _ViewStart.cshtml do kořenové složky aplikace.

Oblasti publikování

Všechny soubory a soubory *.cshtml v adresáři wwwroot se publikují do výstupu, pokud <Project Sdk="Microsoft.NET.Sdk.Web"> je součástí souboru *.csproj.

Přidání oblasti MVC pomocí sady Visual Studio

V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte PŘIDAT > novou vygenerovanou položku a pak vyberte oblast MVC.

Další prostředky

Oblasti jsou funkce ASP.NET sloužící k uspořádání souvisejících funkcí do skupiny jako samostatné:

  • Obor názvů pro směrování
  • Struktura složek pro zobrazení a Razor stránky

Použití oblastí vytvoří hierarchii pro účely směrování přidáním dalšího parametru trasy , areado controller a action nebo Razor stránky page.

Oblasti poskytují způsob, jak rozdělit webovou aplikaci ASP.NET Core do menších funkčních skupin, z nichž každá má vlastní sadu Razor stránek, kontrolerů, zobrazení a modelů. Oblast je v podstatě struktura uvnitř aplikace. Ve webovém projektu ASP.NET Core se logické komponenty, jako jsou Pages, Model, Controller a View, uchovávají v různých složkách. Modul runtime ASP.NET Core používá zásady vytváření názvů k vytvoření vztahu mezi těmito komponentami. U velké aplikace může být výhodné rozdělit aplikaci do samostatných oblastí funkčnosti vysoké úrovně. Například aplikace elektronického obchodování s několika obchodními jednotkami, jako je pokladna, fakturace a vyhledávání. Každá z těchto jednotek má vlastní oblast, která obsahuje zobrazení, kontrolery, Razor stránky a modely.

Zvažte použití oblastí v projektu v následujících případech:

  • Aplikace je tvořená několika funkčními komponentami vysoké úrovně, které je možné logicky oddělit.
  • Chcete rozdělit aplikaci tak, aby každá funkční oblast fungovala nezávisle na sobě.

Zobrazení nebo stažení vzorového kódu (postup stažení) Ukázka stahování poskytuje základní aplikaci pro testovací oblasti.

Pokud používáte Razor stránky, přečtěte si téma Oblasti se stránkami Razor v tomto dokumentu.

Oblasti pro kontrolery se zobrazeními

Typická webová aplikace ASP.NET Core, která používá oblasti, kontrolery a zobrazení, obsahuje následující:

  • Struktura složek Oblasti.

  • Kontrolery s atributem [Area] pro přidružení kontroleru k oblasti:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Trasa oblasti přidaná ke spuštění:

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

Struktura složek oblasti

Představte si aplikaci, která má dvě logické skupiny, produkty a služby. Struktura složek by se při použití oblastí podobala následujícímu:

  • Název projektu
    • Oblastech
      • Produkty
        • Řadiče
          • HomeController.cs
          • ManageController.cs
        • Zobrazení
          • Home
            • Soubor Index.cshtml
          • Spravovat
            • Soubor Index.cshtml
            • About.cshtml
      • Služby
        • Řadiče
          • HomeController.cs
        • Zobrazení
          • Home
            • Soubor Index.cshtml

Zatímco předchozí rozložení je typické při použití oblastí, k použití této struktury složek se vyžadují pouze soubory zobrazení. Zobrazení vyhledávání hledá odpovídající soubor zobrazení oblasti v následujícím pořadí:

/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

Přidružení kontroleru k oblasti

Řadiče oblastí jsou označené atributem [Area] (Oblast):

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

Přidat trasu oblasti

Trasy oblastí obvykle používají konvenční směrování místo směrování atributů. Konvenční směrování je závislé na pořadí. Obecně platí, že trasy s oblastmi by měly být umístěny dříve v směrovací tabulce, protože jsou konkrétnější než trasy bez oblasti.

{area:...} lze použít jako token v šablonách tras, pokud je prostor adres URL jednotný ve všech oblastech:

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

V předchozím kódu použije omezení, exists které musí trasa shodovat s oblastí. Použití s {area:...}MapControllerRoute:

  • Je nejméně komplikovaný mechanismus přidávání směrování do oblastí.
  • Odpovídá všem kontrolerům s atributem [Area("Area name")] .

Následující kód používá MapAreaControllerRoute k vytvoření dvou pojmenovaných tras oblasti:

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

Další informace naleznete v tématu Směrování oblasti.

Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí:

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

Stažení ukázky zahrnuje částečné zobrazení , které obsahuje:

  • Předchozí odkazy.
  • Odkazy podobné předchozímu s výjimkou area nejsou zadány.

Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti a kontroleru.

Pokud není zadána oblast nebo kontroler, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy s kódem, který neurčuje oblast.

Další informace naleznete v tématu Směrování na akce kontroleru.

Sdílené rozložení oblastí pomocí souboru _ViewStart.cshtml

Pokud chcete sdílet společné rozložení pro celou aplikaci, ponechte _ViewStart.cshtml v kořenové složce aplikace. Další informace najdete v tématu Rozložení v ASP.NET Core

Kořenová složka aplikace

Kořenová složka aplikace je složka, která obsahuje Startup.cs webovou aplikaci vytvořenou pomocí šablon ASP.NET Core.

_ViewImports.cshtml

/Views/_ViewImports.cshtml, pro MVC a /Pages/_ViewImports.cshtml pro Razor stránky se neimportuje do zobrazení v oblastech. Pomocí jednoho z následujících přístupů můžete zobrazit importy do všech zobrazení:

  • Přidejte _ViewImports.cshtml ji do kořenové složky aplikace. V _ViewImports.cshtml kořenové složce aplikace se použije pro všechna zobrazení v aplikaci.
  • _ViewImports.cshtml Zkopírujte soubor do příslušné složky zobrazení v oblastech.

Soubor _ViewImports.cshtml obvykle obsahuje importy @usingpomocných rutin značek a @inject příkazy. Další informace naleznete v tématu Import sdílených direktiv.

Změna výchozí složky oblasti, ve které jsou uložená zobrazení

Následující kód změní výchozí složku oblasti z"Areas":"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();
}

Oblasti se stránkami Razor

Oblasti se stránkami Razor vyžadují Areas/<area name>/Pages složku v kořenovém adresáři aplikace. V ukázkové aplikaci se používá následující struktura složek:

  • Název projektu
    • Oblastech
      • Produkty
        • Stránky
          • _ViewImports
          • O uživateli
          • Index
      • Služby
        • Stránky
          • Spravovat
            • O uživateli
            • Index

Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí (například 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>

Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti.

Pokud oblast není zadána, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy. Představte si například odkazy vygenerované z následujícího kódu:

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

Pro předchozí kód:

  • Odkaz vygenerovaný z <a asp-page="/Manage/About"> je správný pouze v případě, že poslední žádost byla pro stránku v Services oblasti. Například , /Services/Manage/, /Services/Manage/Indexnebo /Services/Manage/About.
  • Odkaz vygenerovaný z <a asp-page="/About"> je správný pouze v případě, že poslední požadavek byl pro stránku v /Home.
  • Kód pochází z ukázkového stažení.

Import pomocných rutin oboru názvů a značek pomocí souboru _ViewImports

Do _ViewImports.cshtml každé složky Stránky oblasti lze přidat soubor, který naimportuje obor názvů a pomocné rutiny značek do každé Razor stránky ve složce.

Vezměte v úvahu oblast Služby ukázkového kódu, která neobsahuje _ViewImports.cshtml soubor. Následující kód ukazuje stránku /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>

V předchozím kódu:

  • Plně kvalifikovaný název třídy se musí použít k určení modelu (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Pomocné rutiny značek jsou povoleny @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

V ukázkovém stažení obsahuje oblast Produkty následující _ViewImports.cshtml soubor:

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

Následující kód ukazuje stránku /Products/AboutRazor:

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

V předchozím souboru se obor názvů a @addTagHelper direktiva importují do souboru souborem Areas/Products/Pages/_ViewImports.cshtml .

Další informace naleznete v tématu Správa oboru pomocné rutiny značek a import sdílených direktiv.

Sdílené rozložení pro Razor oblasti stránek

Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte ji _ViewStart.cshtml do kořenové složky aplikace.

Oblasti publikování

Všechny soubory a soubory *.cshtml v adresáři wwwroot se publikují do výstupu, pokud <Project Sdk="Microsoft.NET.Sdk.Web"> je součástí souboru *.csproj.

Přidání oblasti MVC pomocí sady Visual Studio

V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte PŘIDAT > novou vygenerovanou položku a pak vyberte oblast MVC.

Oblasti jsou funkce ASP.NET sloužící k uspořádání souvisejících funkcí do skupiny jako samostatného oboru názvů (pro směrování) a strukturu složek (pro zobrazení). Použití oblastí vytvoří hierarchii pro účely směrování přidáním dalšího parametru trasy , areado controller a action nebo Razor stránky page.

Oblasti poskytují způsob, jak rozdělit webovou aplikaci ASP.NET Core do menších funkčních skupin, z nichž každá má vlastní sadu Razor stránek, kontrolerů, zobrazení a modelů. Oblast je v podstatě struktura uvnitř aplikace. Ve webovém projektu ASP.NET Core se logické komponenty, jako jsou Pages, Model, Controller a View, uchovávají v různých složkách. Modul runtime ASP.NET Core používá zásady vytváření názvů k vytvoření vztahu mezi těmito komponentami. U velké aplikace může být výhodné rozdělit aplikaci do samostatných oblastí funkčnosti vysoké úrovně. Například aplikace elektronického obchodování s několika obchodními jednotkami, jako je pokladna, fakturace a vyhledávání. Každá z těchto jednotek má vlastní oblast, která obsahuje zobrazení, kontrolery, Razor stránky a modely.

Zvažte použití oblastí v projektu v následujících případech:

  • Aplikace je tvořená několika funkčními komponentami vysoké úrovně, které je možné logicky oddělit.
  • Chcete rozdělit aplikaci tak, aby každá funkční oblast fungovala nezávisle na sobě.

Zobrazení nebo stažení vzorového kódu (postup stažení) Ukázka stahování poskytuje základní aplikaci pro testovací oblasti.

Pokud používáte Razor stránky, přečtěte si téma Oblasti se stránkami Razor v tomto dokumentu.

Oblasti pro kontrolery se zobrazeními

Typická webová aplikace ASP.NET Core, která používá oblasti, kontrolery a zobrazení, obsahuje následující:

  • Struktura složek Oblasti.

  • Kontrolery s atributem [Area] pro přidružení kontroleru k oblasti:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Trasa oblasti přidaná ke spuštění:

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

Struktura složek oblasti

Představte si aplikaci, která má dvě logické skupiny, produkty a služby. Struktura složek by se při použití oblastí podobala následujícímu:

  • Název projektu
    • Oblastech
      • Produkty
        • Řadiče
          • HomeController.cs
          • ManageController.cs
        • Zobrazení
          • Home
            • Soubor Index.cshtml
          • Spravovat
            • Soubor Index.cshtml
            • About.cshtml
      • Služby
        • Řadiče
          • HomeController.cs
        • Zobrazení
          • Home
            • Soubor Index.cshtml

Zatímco předchozí rozložení je typické při použití oblastí, k použití této struktury složek se vyžadují pouze soubory zobrazení. Zobrazení vyhledávání hledá odpovídající soubor zobrazení oblasti v následujícím pořadí:

/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

Přidružení kontroleru k oblasti

Řadiče oblastí jsou označené atributem [Area] (Oblast):

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

Přidat trasu oblasti

Trasy oblastí obvykle používají konvenční směrování místo směrování atributů. Konvenční směrování je závislé na pořadí. Obecně platí, že trasy s oblastmi by měly být umístěny dříve v směrovací tabulce, protože jsou konkrétnější než trasy bez oblasti.

{area:...} lze použít jako token v šablonách tras, pokud je prostor adres URL jednotný ve všech oblastech:

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

V předchozím kódu použije omezení, exists které musí trasa shodovat s oblastí. Použití {area:...} je nejméně komplikovaný mechanismus přidávání směrování do oblastí.

Následující kód používá MapAreaRoute k vytvoření dvou pojmenovaných tras oblasti:

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

Pokud používáte s MapAreaRoute ASP.NET Core 2.2, podívejte se na tento problém na GitHubu.

Další informace naleznete v tématu Směrování oblasti.

Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí:

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

Odkazy vygenerované s předchozím kódem jsou platné kdekoli v aplikaci.

Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti a kontroleru.

Pokud není zadána oblast nebo kontroler, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy.

Další informace naleznete v tématu Směrování na akce kontroleru.

Sdílené rozložení oblastí pomocí souboru _ViewStart.cshtml

Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte ji _ViewStart.cshtml do kořenové složky aplikace.

_ViewImports.cshtml

Ve standardním umístění /Views/_ViewImports.cshtml se nevztahuje na oblasti. Pokud chcete použít běžné pomocné rutiny @usingznaček nebo @inject v oblasti, ujistěte se, že se pro zobrazení oblasti použije správný _ViewImports.cshtml soubor. Pokud chcete stejné chování ve všech zobrazeních, přejděte /Views/_ViewImports.cshtml do kořenového adresáře aplikace.

Změna výchozí složky oblasti, ve které jsou uložená zobrazení

Následující kód změní výchozí složku oblasti z"Areas":"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();
}

Oblasti se stránkami Razor

Oblasti se stránkami Razor vyžadují Areas/<area name>/Pages složku v kořenovém adresáři aplikace. V ukázkové aplikaci se používá následující struktura složek:

  • Název projektu
    • Oblastech
      • Produkty
        • Stránky
          • _ViewImports
          • O uživateli
          • Index
      • Služby
        • Stránky
          • Spravovat
            • O uživateli
            • Index

Následující kód z ukázkového stažení ukazuje generování odkazů se zadanou oblastí (například 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>

Odkazy vygenerované s předchozím kódem jsou platné kdekoli v aplikaci.

Stažení ukázky zahrnuje částečné zobrazení , které obsahuje předchozí odkazy a stejné odkazy bez zadání oblasti. Částečné zobrazení se odkazuje v souboru rozložení, takže každá stránka v aplikaci zobrazí vygenerované odkazy. Odkazy vygenerované bez zadání oblasti jsou platné pouze při odkazování ze stránky ve stejné oblasti.

Pokud oblast není zadána, směrování závisí na okolních hodnotách. Aktuální hodnoty tras aktuálního požadavku jsou považovány za okolní hodnoty pro generování propojení. V mnoha případech pro ukázkovou aplikaci pomocí okolních hodnot generuje nesprávné odkazy. Představte si například odkazy vygenerované z následujícího kódu:

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

Pro předchozí kód:

  • Odkaz vygenerovaný z <a asp-page="/Manage/About"> je správný pouze v případě, že poslední žádost byla pro stránku v Services oblasti. Například , /Services/Manage/, /Services/Manage/Indexnebo /Services/Manage/About.
  • Odkaz vygenerovaný z <a asp-page="/About"> je správný pouze v případě, že poslední požadavek byl pro stránku v /Home.
  • Kód pochází z ukázkového stažení.

Import pomocných rutin oboru názvů a značek pomocí souboru _ViewImports

Do _ViewImports.cshtml každé složky Stránky oblasti lze přidat soubor, který naimportuje obor názvů a pomocné rutiny značek do každé Razor stránky ve složce.

Vezměte v úvahu oblast Služby ukázkového kódu, která neobsahuje _ViewImports.cshtml soubor. Následující kód ukazuje stránku /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>

V předchozím kódu:

  • Plně kvalifikovaný název domény se musí použít k určení modelu (@model RPareas.Areas.Services.Pages.Manage.AboutModel).
  • Pomocné rutiny značek jsou povoleny @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

V ukázkovém stažení obsahuje oblast Produkty následující _ViewImports.cshtml soubor:

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

Následující kód ukazuje stránku /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>

V předchozím souboru se obor názvů a @addTagHelper direktiva importují do souboru souborem Areas/Products/Pages/_ViewImports.cshtml .

Další informace naleznete v tématu Správa oboru pomocné rutiny značek a import sdílených direktiv.

Sdílené rozložení pro Razor oblasti stránek

Pokud chcete sdílet společné rozložení pro celou aplikaci, přesuňte ji _ViewStart.cshtml do kořenové složky aplikace.

Oblasti publikování

Všechny soubory a soubory *.cshtml v adresáři wwwroot se publikují do výstupu, pokud <Project Sdk="Microsoft.NET.Sdk.Web"> je součástí souboru *.csproj.