ASP.NET Core'daki alanlar

Tarafından Dhananjay Kumar ve Rick Anderson

Alanlar, ilgili işlevleri bir grupta ayrı olarak düzenlemek için kullanılan ASP.NET bir özelliktir:

  • Yönlendirme için ad alanı.
  • Görünümler ve Razor Sayfalar için klasör yapısı.

Alanları kullanmak, ve veya page pageolarak başka bir yol parametresi actioncontrollerareaekleyerek yönlendirme amacıyla bir Razor hiyerarşi oluşturur.

Alanlar, bir ASP.NET Core Web uygulamasını her biri kendi Sayfa, denetleyici, görünüm ve model kümesine Razor sahip daha küçük işlevsel gruplar halinde bölümlemenin bir yolunu sağlar. Alan, uygulamanın içindeki bir yapıdır. ASP.NET Core web projesinde Sayfalar, Model, Denetleyici ve Görünüm gibi mantıksal bileşenler farklı klasörlerde tutulur. ASP.NET Core çalışma zamanı, bu bileşenler arasındaki ilişkiyi oluşturmak için adlandırma kurallarını kullanır. Büyük bir uygulama için, uygulamayı ayrı üst düzey işlevsellik alanlarına bölmek avantajlı olabilir. Örneğin, ödeme, faturalama ve arama gibi birden çok iş birimine sahip bir e-ticaret uygulaması. Bu birimlerin her birinin görünümleri, denetleyicileri Razor , Sayfaları ve modelleri içeren kendi alanları vardır.

Aşağıdaki durumlarda projede Alanlar kullanmayı göz önünde bulundurun:

  • Uygulama, mantıksal olarak ayrılabilen birden çok üst düzey işlevsel bileşenden oluşur.
  • Her işlevsel alanın bağımsız olarak üzerinde çalışılabilmesi için uygulamayı bölümlendirmek istiyorsunuz.

Sayfalar kullanıyorsanızRazor, bu belgede Sayfaların bulunduğu Razor alanlar bölümüne bakın.

Görünümlere sahip denetleyiciler için alanlar

Alanları, denetleyicileri ve görünümleri kullanan tipik bir ASP.NET Core web uygulaması şunları içerir:

  • Alan klasörü yapısı.

  • Denetleyiciyi [Area] alanla ilişkilendirmek için özniteliğine sahip denetleyiciler:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • alanına eklenen Program.csalan yolu:

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

Alan klasörü yapısı

Ürünler ve Hizmetler olmak üzere iki mantıksal grubu olan bir uygulamayı düşünün. Alanları kullanarak klasör yapısı aşağıdakine benzer olacaktır:

  • Proje adı
    • Alanları
      • Ürünler
        • Denetleyici
          • HomeController.cs
          • ManageController.cs
        • Görünümler
          • Home
            • Index.cshtml
          • Yönetmek
            • Index.cshtml
            • About.cshtml
      • Hizmetleri
        • Denetleyici
          • HomeController.cs
        • Görünümler
          • Home
            • Index.cshtml

Önceki düzen Alanlar kullanılırken tipik olsa da, bu klasör yapısını kullanmak için yalnızca görünüm dosyaları gereklidir. Eşleşen bir alan görünümü dosyası için bulma aramalarını aşağıdaki sırayla görüntüleyin:

/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

Denetleyiciyi bir Alanla ilişkilendirme

Alan denetleyicileri şu öznitelikle [Area] belirlenir:

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

Alan yolu ekle

Alan yolları genellikle öznitelik yönlendirmesi yerine geleneksel yönlendirme kullanır. Geleneksel yönlendirme, siparişe bağlıdır. Genel olarak, alanları olan yollar, alan içermeyen rotalardan daha belirgin olduklarından, rota tablosunda daha önce yerleştirilmelidir.

{area:...} url alanı tüm alanlarda tekdüzense yol şablonlarında belirteç olarak kullanılabilir:

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

Yukarıdaki kodda, exists yolun bir alanla eşleşmesi gereken bir kısıtlama uygular. ile kullanma {area:...}MapControllerRoute:

  • Alanlara yönlendirme eklemek için en az karmaşık mekanizmadır.
  • Tüm denetleyicileri özniteliğiyle [Area("Area name")] eşleştirir.

Aşağıdaki kod iki adlandırılmış alan yolu oluşturmak için kullanır MapAreaControllerRoute :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapAreaControllerRoute(
    name: "MyAreaProducts",
    areaName: "Products",
    pattern: "Products/{controller=Home}/{action=Index}/{id?}");

app.MapAreaControllerRoute(
    name: "MyAreaServices",
    areaName: "Services",
    pattern: "Services/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

Daha fazla bilgi için bkz . Alan yönlendirme.

Örnek indirmedeki aşağıdaki kod, belirtilen alanla bağlantı oluşturmayı gösterir:

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

Örnek indirme, aşağıdakileri içeren kısmi bir görünüm içerir:

  • Önceki bağlantılar.
  • Yukarıdakine area benzer bağlantılar belirtilmemiştir.

Düzen dosyasında kısmi görünüme başvuruldığından, uygulamadaki her sayfa oluşturulan bağlantıları görüntüler. Alanı belirtmeden oluşturulan bağlantılar yalnızca aynı alan ve denetleyicideki bir sayfadan başvurulduğunda geçerlidir.

Alan veya denetleyici belirtilmediğinde, yönlendirme ortam değerlerine bağlıdır. Geçerli isteğin geçerli yol değerleri, bağlantı oluşturma için ortam değerleri olarak kabul edilir. Örnek uygulama için çoğu durumda, ortam değerlerinin kullanılması alanı belirtmeyen işaretlemeyle yanlış bağlantılar oluşturur.

Daha fazla bilgi için bkz . Denetleyici eylemlerine yönlendirme.

_ViewStart.cshtml dosyasını kullanan Alanlar için paylaşılan düzen

Uygulamanın tamamı için ortak bir düzeni paylaşmak için _ViewStart.cshtml dosyasını uygulama kök klasöründe tutun. Daha fazla bilgi için bkz . ASP.NET Core'da düzen

Uygulama kök klasörü

Uygulama kök klasörü, ASP.NET Core şablonlarıyla oluşturulan bir web uygulamasındaki dosyayı içeren Program.cs klasördür.

_ViewImports.cshtml

MVC için /Views/_ViewImports.cshtml ve Sayfalar için Razor /Pages/_ViewImports.cshtml, alanlardaki görünümlere aktarılmaz. Tüm görünümlere görünüm içeri aktarmaları sağlamak için aşağıdaki yaklaşımlardan birini kullanın:

  • uygulama kök klasörüne _ViewImports.cshtml ekleyin. Uygulama kök klasöründeki bir _ViewImports.cshtml, uygulamadaki tüm görünümlere uygulanır.
  • _ViewImports.cshtml dosyasını alanlar altındaki uygun görünüm klasörüne kopyalayın. Örneğin, tek tek kullanıcı hesaplarıyla oluşturulan sayfalar Razor uygulamasının aşağıdaki klasörlerde bir _ViewImports.cshtml dosyası vardır:
    • /Areas//IdentityPages/_ViewImports.cshtml
    • /Pages/_ViewImports.cshtml

_ViewImports.cshtml dosyası genellikle Etiket Yardımcıları içeri aktarmalarını, @usingve @inject deyimlerini içerir. Daha fazla bilgi için bkz . Paylaşılan Yönergeleri İçeri Aktarma.

Görünümlerin depolandığı varsayılan alan klasörünü değiştirme

Aşağıdaki kod, varsayılan alan klasörünü olarak "Areas""MyAreas"değiştirir:

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

Sayfaları olan Razor alanlar

Sayfaları olan Razor alanlar, uygulamanın kökünde bir Areas/<area name>/Pages klasör gerektirir. Aşağıdaki klasör yapısı örnek uygulamayla birlikte kullanılır:

  • Proje adı
    • Alanları
      • Ürünler
        • Sayfa
          • _ViewImports
          • Hakkında
          • Dizin oluşturma
      • Hizmetleri
        • Sayfa
          • Yönetmek
            • Hakkında
            • Dizin oluşturma

Örnek indirmedeki aşağıdaki kod, belirtilen alanla bağlantı oluşturmayı gösterir (örneğin, 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>

Örnek indirme, alanı belirtmeden önceki bağlantıları ve aynı bağlantıları içeren kısmi bir görünüm içerir. Düzen dosyasında kısmi görünüme başvuruldığından, uygulamadaki her sayfa oluşturulan bağlantıları görüntüler. Alanı belirtmeden oluşturulan bağlantılar yalnızca aynı alandaki bir sayfadan başvurulduğunda geçerlidir.

Alan belirtilmediğinde yönlendirme, ortam değerlerine bağlıdır. Geçerli isteğin geçerli yol değerleri, bağlantı oluşturma için ortam değerleri olarak kabul edilir. Örnek uygulama için çoğu durumda ortam değerlerinin kullanılması yanlış bağlantılar oluşturur. Örneğin, aşağıdaki koddan oluşturulan bağlantıları göz önünde bulundurun:

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

Önceki kod için:

  • Öğesinden <a asp-page="/Manage/About"> oluşturulan bağlantı yalnızca alandaki bir sayfa Services için son istek olduğunda doğrudur. Örneğin, /Services/Manage/, /Services/Manage/Index veya /Services/Manage/About.
  • öğesinden <a asp-page="/About"> oluşturulan bağlantı yalnızca içindeki bir sayfa /Homeiçin son istek olduğunda doğrudur.
  • Kod, örnek indirmeden alınmalıdır.

ad alanını ve Etiket Yardımcılarını _ViewImports dosyasıyla içeri aktarma

Ad alanını ve Etiket Yardımcılarını Razor klasördeki her Sayfaya aktarmak için her alan Sayfaları klasörüne bir _ViewImports.cshtml dosyası eklenebilir.

_ViewImports.cshtml dosyası içermeyen örnek kodun Hizmetler alanını göz önünde bulundurun. Aşağıdaki işaretleme /Services/Manage/AboutRazor Sayfasını gösterir:

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

Önceki işaretlemede:

  • Modeli (@model RPareas.Areas.Services.Pages.Manage.AboutModel) belirtmek için tam sınıf adı kullanılmalıdır.
  • Etiket Yardımcıları@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Örnek indirmede, Ürünler alanı aşağıdaki _ViewImports.cshtml dosyasını içerir:

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

Aşağıdaki işaretleme /Products/AboutRazor Sayfasını gösterir:

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

Yukarıdaki dosyada, ad alanı ve @addTagHelper yönergesi Areas/Products/Pages/_ViewImports.cshtml dosyası tarafından dosyaya aktarılır.

Daha fazla bilgi için bkz . Etiket Yardımcısı kapsamını yönetme ve Paylaşılan Yönergeleri İçeri Aktarma.

Sayfa Alanları için Razor paylaşılan düzen

Tüm uygulamanın ortak düzenini paylaşmak için _ViewStart.cshtml dosyasını uygulama kök klasörüne taşıyın.

Yayımlama Alanları

Wwwroot dizinindeki tüm *.cshtml dosyaları ve dosyaları, *.csproj dosyasına eklendiğinde <Project Sdk="Microsoft.NET.Sdk.Web"> çıkışa yayımlanır.

Visual Studio ile MVC Alanı Ekleme

Çözüm Gezgini'da projeye sağ tıklayın ve Yeni İskeleli Öğe Ekle'yi > ve ardından MVC Alanı'nı seçin.

Ek kaynaklar

Alanlar, ilgili işlevleri bir grupta ayrı olarak düzenlemek için kullanılan ASP.NET bir özelliktir:

  • Yönlendirme için ad alanı.
  • Görünümler ve Razor Sayfalar için klasör yapısı.

Alanları kullanmak, ve veya page pageolarak başka bir yol parametresi actioncontrollerareaekleyerek yönlendirme amacıyla bir Razor hiyerarşi oluşturur.

Alanlar, bir ASP.NET Core Web uygulamasını her biri kendi Sayfa, denetleyici, görünüm ve model kümesine Razor sahip daha küçük işlevsel gruplar halinde bölümlemenin bir yolunu sağlar. Alan, uygulamanın içindeki bir yapıdır. ASP.NET Core web projesinde Sayfalar, Model, Denetleyici ve Görünüm gibi mantıksal bileşenler farklı klasörlerde tutulur. ASP.NET Core çalışma zamanı, bu bileşenler arasındaki ilişkiyi oluşturmak için adlandırma kurallarını kullanır. Büyük bir uygulama için, uygulamayı ayrı üst düzey işlevsellik alanlarına bölmek avantajlı olabilir. Örneğin, ödeme, faturalama ve arama gibi birden çok iş birimine sahip bir e-ticaret uygulaması. Bu birimlerin her birinin görünümleri, denetleyicileri Razor , Sayfaları ve modelleri içeren kendi alanları vardır.

Aşağıdaki durumlarda projede Alanlar kullanmayı göz önünde bulundurun:

  • Uygulama, mantıksal olarak ayrılabilen birden çok üst düzey işlevsel bileşenden oluşur.
  • Her işlevsel alanın bağımsız olarak üzerinde çalışılabilmesi için uygulamayı bölümlendirmek istiyorsunuz.

Örnek kodu görüntüleme veya indirme (indirme). İndirme örneği, test alanları için temel bir uygulama sağlar.

Sayfalar kullanıyorsanızRazor, bu belgede Sayfaların bulunduğu Razor alanlar bölümüne bakın.

Görünümlere sahip denetleyiciler için alanlar

Alanları, denetleyicileri ve görünümleri kullanan tipik bir ASP.NET Core web uygulaması şunları içerir:

  • Alan klasörü yapısı.

  • Denetleyiciyi [Area] alanla ilişkilendirmek için özniteliğine sahip denetleyiciler:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Başlatmaya eklenen alan yolu:

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

Alan klasörü yapısı

Ürünler ve Hizmetler olmak üzere iki mantıksal grubu olan bir uygulamayı düşünün. Alanları kullanarak klasör yapısı aşağıdakine benzer olacaktır:

  • Proje adı
    • Alanları
      • Ürünler
        • Denetleyici
          • HomeController.cs
          • ManageController.cs
        • Görünümler
          • Home
            • Index.cshtml
          • Yönetmek
            • Index.cshtml
            • About.cshtml
      • Hizmetleri
        • Denetleyici
          • HomeController.cs
        • Görünümler
          • Home
            • Index.cshtml

Önceki düzen Alanlar kullanılırken tipik olsa da, bu klasör yapısını kullanmak için yalnızca görünüm dosyaları gereklidir. Eşleşen bir alan görünümü dosyası için bulma aramalarını aşağıdaki sırayla görüntüleyin:

/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

Denetleyiciyi bir Alanla ilişkilendirme

Alan denetleyicileri [Alan] özniteliğiyle belirlenir:

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

Alan yolu ekle

Alan yolları genellikle öznitelik yönlendirmesi yerine geleneksel yönlendirme kullanır. Geleneksel yönlendirme, siparişe bağlıdır. Genel olarak, alanları olan yollar, alan içermeyen rotalardan daha belirgin olduklarından, rota tablosunda daha önce yerleştirilmelidir.

{area:...} url alanı tüm alanlarda tekdüzense yol şablonlarında belirteç olarak kullanılabilir:

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

Yukarıdaki kodda, exists yolun bir alanla eşleşmesi gereken bir kısıtlama uygular. ile kullanma {area:...}MapControllerRoute:

  • Alanlara yönlendirme eklemek için en az karmaşık mekanizmadır.
  • Tüm denetleyicileri özniteliğiyle [Area("Area name")] eşleştirir.

Aşağıdaki kod iki adlandırılmış alan yolu oluşturmak için kullanır MapAreaControllerRoute :

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapAreaControllerRoute(
            name: "MyAreaProducts",
            areaName: "Products",
            pattern: "Products/{controller=Home}/{action=Index}/{id?}");

        endpoints.MapAreaControllerRoute(
            name: "MyAreaServices",
            areaName: "Services",
            pattern: "Services/{controller=Home}/{action=Index}/{id?}");

        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Daha fazla bilgi için bkz . Alan yönlendirme.

Örnek indirmedeki aşağıdaki kod, belirtilen alanla bağlantı oluşturmayı gösterir:

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

Örnek indirme, aşağıdakileri içeren kısmi bir görünüm içerir:

  • Önceki bağlantılar.
  • Yukarıdakine area benzer bağlantılar belirtilmemiştir.

Düzen dosyasında kısmi görünüme başvuruldığından, uygulamadaki her sayfa oluşturulan bağlantıları görüntüler. Alanı belirtmeden oluşturulan bağlantılar yalnızca aynı alan ve denetleyicideki bir sayfadan başvurulduğunda geçerlidir.

Alan veya denetleyici belirtilmediğinde, yönlendirme ortam değerlerine bağlıdır. Geçerli isteğin geçerli yol değerleri, bağlantı oluşturma için ortam değerleri olarak kabul edilir. Örnek uygulama için çoğu durumda, ortam değerlerinin kullanılması alanı belirtmeyen işaretlemeyle yanlış bağlantılar oluşturur.

Daha fazla bilgi için bkz . Denetleyici eylemlerine yönlendirme.

_ViewStart.cshtml dosyasını kullanan Alanlar için paylaşılan düzen

Uygulamanın tamamı için ortak bir düzeni paylaşmak için, öğesini uygulama kök klasöründe tutun_ViewStart.cshtml. Daha fazla bilgi için bkz . ASP.NET Core'da düzen

Uygulama kök klasörü

Uygulama kök klasörü, ASP.NET Core şablonlarıyla oluşturulan web uygulamasını içeren Startup.cs klasördür.

_ViewImports.cshtml

/Views/_ViewImports.cshtml, MVC için ve /Pages/_ViewImports.cshtml Sayfalar için Razor , alanlardaki görünümlere aktarılmaz. Tüm görünümlere görünüm içeri aktarmaları sağlamak için aşağıdaki yaklaşımlardan birini kullanın:

  • Uygulama kök klasörüne ekleyin_ViewImports.cshtml. Uygulama kök klasöründeki bir _ViewImports.cshtml , uygulamadaki tüm görünümlere uygulanır.
  • _ViewImports.cshtml Dosyayı alanlar altındaki uygun görünüm klasörüne kopyalayın.

Dosya _ViewImports.cshtml genellikle Etiket Yardımcıları içeri aktarmalarını, @usingve @inject deyimlerini içerir. Daha fazla bilgi için bkz . Paylaşılan Yönergeleri İçeri Aktarma.

Görünümlerin depolandığı varsayılan alan klasörünü değiştirme

Aşağıdaki kod, varsayılan alan klasörünü olarak "Areas""MyAreas"değiştirir:

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

Sayfaları olan Razor alanlar

Sayfaları olan Razor alanlar, uygulamanın kökünde bir Areas/<area name>/Pages klasör gerektirir. Aşağıdaki klasör yapısı örnek uygulamayla birlikte kullanılır:

  • Proje adı
    • Alanları
      • Ürünler
        • Sayfa
          • _ViewImports
          • Hakkında
          • Dizin oluşturma
      • Hizmetleri
        • Sayfa
          • Yönetmek
            • Hakkında
            • Dizin oluşturma

Örnek indirmedeki aşağıdaki kod, belirtilen alanla bağlantı oluşturmayı gösterir (örneğin, 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>

Örnek indirme, alanı belirtmeden önceki bağlantıları ve aynı bağlantıları içeren kısmi bir görünüm içerir. Düzen dosyasında kısmi görünüme başvuruldığından, uygulamadaki her sayfa oluşturulan bağlantıları görüntüler. Alanı belirtmeden oluşturulan bağlantılar yalnızca aynı alandaki bir sayfadan başvurulduğunda geçerlidir.

Alan belirtilmediğinde yönlendirme, ortam değerlerine bağlıdır. Geçerli isteğin geçerli yol değerleri, bağlantı oluşturma için ortam değerleri olarak kabul edilir. Örnek uygulama için çoğu durumda ortam değerlerinin kullanılması yanlış bağlantılar oluşturur. Örneğin, aşağıdaki koddan oluşturulan bağlantıları göz önünde bulundurun:

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

Önceki kod için:

  • Öğesinden <a asp-page="/Manage/About"> oluşturulan bağlantı yalnızca alandaki bir sayfa Services için son istek olduğunda doğrudur. Örneğin, /Services/Manage/, /Services/Manage/Index veya /Services/Manage/About.
  • öğesinden <a asp-page="/About"> oluşturulan bağlantı yalnızca içindeki bir sayfa /Homeiçin son istek olduğunda doğrudur.
  • Kod, örnek indirmeden alınmalıdır.

ad alanını ve Etiket Yardımcılarını _ViewImports dosyasıyla içeri aktarma

_ViewImports.cshtml Ad alanını ve Etiket Yardımcılarını klasördeki her Sayfaya aktarmak için her Razor alan Sayfaları klasörüne bir dosya eklenebilir.

Dosya içermeyen _ViewImports.cshtml örnek kodun Hizmetler alanını göz önünde bulundurun. Aşağıdaki işaretleme /Services/Manage/AboutRazor Sayfasını gösterir:

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

Önceki işaretlemede:

  • Modeli (@model RPareas.Areas.Services.Pages.Manage.AboutModel) belirtmek için tam sınıf adı kullanılmalıdır.
  • Etiket Yardımcıları@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Örnek indirmede Ürünler alanı aşağıdaki _ViewImports.cshtml dosyayı içerir:

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

Aşağıdaki işaretleme /Products/AboutRazor Sayfasını gösterir:

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

Önceki dosyada, ad alanı ve @addTagHelper yönergesi dosya tarafından dosyaya Areas/Products/Pages/_ViewImports.cshtml aktarılır.

Daha fazla bilgi için bkz . Etiket Yardımcısı kapsamını yönetme ve Paylaşılan Yönergeleri İçeri Aktarma.

Sayfa Alanları için Razor paylaşılan düzen

Uygulamanın tamamı için ortak bir düzen paylaşmak için öğesini uygulama kök klasörüne taşıyın _ViewStart.cshtml .

Yayımlama Alanları

Wwwroot dizinindeki tüm *.cshtml dosyaları ve dosyaları, *.csproj dosyasına eklendiğinde <Project Sdk="Microsoft.NET.Sdk.Web"> çıkışa yayımlanır.

Visual Studio ile MVC Alanı Ekleme

Çözüm Gezgini'da projeye sağ tıklayın ve Yeni İskeleli Öğe Ekle'yi > ve ardından MVC Alanı'nı seçin.

Alanlar, ilgili işlevleri bir grupta ayrı bir ad alanı (yönlendirme için) ve klasör yapısı (görünümler için) olarak düzenlemek için kullanılan bir ASP.NET özelliğidir. Alanları kullanmak, ve veya page pageolarak başka bir yol parametresi actioncontrollerareaekleyerek yönlendirme amacıyla bir Razor hiyerarşi oluşturur.

Alanlar, bir ASP.NET Core Web uygulamasını her biri kendi Sayfa, denetleyici, görünüm ve model kümesine Razor sahip daha küçük işlevsel gruplar halinde bölümlemenin bir yolunu sağlar. Alan, uygulamanın içindeki bir yapıdır. ASP.NET Core web projesinde Sayfalar, Model, Denetleyici ve Görünüm gibi mantıksal bileşenler farklı klasörlerde tutulur. ASP.NET Core çalışma zamanı, bu bileşenler arasındaki ilişkiyi oluşturmak için adlandırma kurallarını kullanır. Büyük bir uygulama için, uygulamayı ayrı üst düzey işlevsellik alanlarına bölmek avantajlı olabilir. Örneğin, ödeme, faturalama ve arama gibi birden çok iş birimine sahip bir e-ticaret uygulaması. Bu birimlerin her birinin görünümleri, denetleyicileri Razor , Sayfaları ve modelleri içeren kendi alanları vardır.

Aşağıdaki durumlarda projede Alanlar kullanmayı göz önünde bulundurun:

  • Uygulama, mantıksal olarak ayrılabilen birden çok üst düzey işlevsel bileşenden oluşur.
  • Her işlevsel alanın bağımsız olarak üzerinde çalışılabilmesi için uygulamayı bölümlendirmek istiyorsunuz.

Örnek kodu görüntüleme veya indirme (indirme). İndirme örneği, test alanları için temel bir uygulama sağlar.

Sayfalar kullanıyorsanızRazor, bu belgede Sayfaların bulunduğu Razor alanlar bölümüne bakın.

Görünümlere sahip denetleyiciler için alanlar

Alanları, denetleyicileri ve görünümleri kullanan tipik bir ASP.NET Core web uygulaması şunları içerir:

  • Alan klasörü yapısı.

  • Denetleyiciyi [Area] alanla ilişkilendirmek için özniteliğine sahip denetleyiciler:

    [Area("Products")]
    public class ManageController : Controller
    {
    
  • Başlatmaya eklenen alan yolu:

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

Alan klasörü yapısı

Ürünler ve Hizmetler olmak üzere iki mantıksal grubu olan bir uygulamayı düşünün. Alanları kullanarak klasör yapısı aşağıdakine benzer olacaktır:

  • Proje adı
    • Alanları
      • Ürünler
        • Denetleyici
          • HomeController.cs
          • ManageController.cs
        • Görünümler
          • Home
            • Index.cshtml
          • Yönetmek
            • Index.cshtml
            • About.cshtml
      • Hizmetleri
        • Denetleyici
          • HomeController.cs
        • Görünümler
          • Home
            • Index.cshtml

Önceki düzen Alanlar kullanılırken tipik olsa da, bu klasör yapısını kullanmak için yalnızca görünüm dosyaları gereklidir. Eşleşen bir alan görünümü dosyası için bulma aramalarını aşağıdaki sırayla görüntüleyin:

/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

Denetleyiciyi bir Alanla ilişkilendirme

Alan denetleyicileri [Alan] özniteliğiyle belirlenir:

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

Alan yolu ekle

Alan yolları genellikle öznitelik yönlendirmesi yerine geleneksel yönlendirme kullanır. Geleneksel yönlendirme, siparişe bağlıdır. Genel olarak, alanları olan yollar, alan içermeyen rotalardan daha belirgin olduklarından, rota tablosunda daha önce yerleştirilmelidir.

{area:...} url alanı tüm alanlarda tekdüzense yol şablonlarında belirteç olarak kullanılabilir:

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

Yukarıdaki kodda, exists yolun bir alanla eşleşmesi gereken bir kısıtlama uygular. Kullanım {area:...} , alanlara yönlendirme eklemek için en az karmaşık mekanizmadır.

Aşağıdaki kod iki adlandırılmış alan yolu oluşturmak için kullanır MapAreaRoute :

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapAreaRoute(
            name: "MyAreaProducts",
            areaName:"Products",
            template: "Products/{controller=Home}/{action=Index}/{id?}");

        routes.MapAreaRoute(
            name: "MyAreaServices",
            areaName: "Services",
            template: "Services/{controller=Home}/{action=Index}/{id?}");

        routes.MapRoute(
           name: "default",
           template: "{controller=Home}/{action=Index}/{id?}");
    });
}

ASP.NET Core 2.2 ile kullanırken MapAreaRoute bu GitHub sorununa bakın.

Daha fazla bilgi için bkz . Alan yönlendirme.

Örnek indirmedeki aşağıdaki kod, belirtilen alanla bağlantı oluşturmayı gösterir:

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

Önceki kodla oluşturulan bağlantılar uygulamanın herhangi bir yerinde geçerlidir.

Örnek indirme, alanı belirtmeden önceki bağlantıları ve aynı bağlantıları içeren kısmi bir görünüm içerir. Düzen dosyasında kısmi görünüme başvuruldığından, uygulamadaki her sayfa oluşturulan bağlantıları görüntüler. Alanı belirtmeden oluşturulan bağlantılar yalnızca aynı alan ve denetleyicideki bir sayfadan başvurulduğunda geçerlidir.

Alan veya denetleyici belirtilmediğinde, yönlendirme ortam değerlerine bağlıdır. Geçerli isteğin geçerli yol değerleri, bağlantı oluşturma için ortam değerleri olarak kabul edilir. Örnek uygulama için çoğu durumda ortam değerlerinin kullanılması yanlış bağlantılar oluşturur.

Daha fazla bilgi için bkz . Denetleyici eylemlerine yönlendirme.

_ViewStart.cshtml dosyasını kullanan Alanlar için paylaşılan düzen

Uygulamanın tamamı için ortak bir düzen paylaşmak için öğesini uygulama kök klasörüne taşıyın _ViewStart.cshtml .

_ViewImports.cshtml

Standart konumunda /Views/_ViewImports.cshtml alanlar için geçerli değildir. Yaygın Etiket Yardımcılarını@using veya @inject bölgenizde kullanmak için, alan görünümleriniz için uygun _ViewImports.cshtml bir dosyanın geçerli olduğundan emin olun. Tüm görünümlerinizde aynı davranışın olmasını istiyorsanız uygulama köküne geçin /Views/_ViewImports.cshtml .

Görünümlerin depolandığı varsayılan alan klasörünü değiştirme

Aşağıdaki kod, varsayılan alan klasörünü olarak "Areas""MyAreas"değiştirir:

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

Sayfaları olan Razor alanlar

Sayfaları olan Razor alanlar, uygulamanın kökünde bir Areas/<area name>/Pages klasör gerektirir. Aşağıdaki klasör yapısı örnek uygulamayla birlikte kullanılır:

  • Proje adı
    • Alanları
      • Ürünler
        • Sayfa
          • _ViewImports
          • Hakkında
          • Dizin oluşturma
      • Hizmetleri
        • Sayfa
          • Yönetmek
            • Hakkında
            • Dizin oluşturma

Örnek indirmedeki aşağıdaki kod, belirtilen alanla bağlantı oluşturmayı gösterir (örneğin, 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>

Önceki kodla oluşturulan bağlantılar uygulamanın herhangi bir yerinde geçerlidir.

Örnek indirme, alanı belirtmeden önceki bağlantıları ve aynı bağlantıları içeren kısmi bir görünüm içerir. Düzen dosyasında kısmi görünüme başvuruldığından, uygulamadaki her sayfa oluşturulan bağlantıları görüntüler. Alanı belirtmeden oluşturulan bağlantılar yalnızca aynı alandaki bir sayfadan başvurulduğunda geçerlidir.

Alan belirtilmediğinde yönlendirme, ortam değerlerine bağlıdır. Geçerli isteğin geçerli yol değerleri, bağlantı oluşturma için ortam değerleri olarak kabul edilir. Örnek uygulama için çoğu durumda ortam değerlerinin kullanılması yanlış bağlantılar oluşturur. Örneğin, aşağıdaki koddan oluşturulan bağlantıları göz önünde bulundurun:

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

Önceki kod için:

  • Öğesinden <a asp-page="/Manage/About"> oluşturulan bağlantı yalnızca alandaki bir sayfa Services için son istek olduğunda doğrudur. Örneğin, /Services/Manage/, /Services/Manage/Index veya /Services/Manage/About.
  • öğesinden <a asp-page="/About"> oluşturulan bağlantı yalnızca içindeki bir sayfa /Homeiçin son istek olduğunda doğrudur.
  • Kod, örnek indirmeden alınmalıdır.

ad alanını ve Etiket Yardımcılarını _ViewImports dosyasıyla içeri aktarma

_ViewImports.cshtml Ad alanını ve Etiket Yardımcılarını klasördeki her Sayfaya aktarmak için her Razor alan Sayfaları klasörüne bir dosya eklenebilir.

Dosya içermeyen _ViewImports.cshtml örnek kodun Hizmetler alanını göz önünde bulundurun. Aşağıdaki işaretleme /Services/Manage/AboutRazor Sayfasını gösterir:

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

Önceki işaretlemede:

  • Modeli (@model RPareas.Areas.Services.Pages.Manage.AboutModel) belirtmek için tam etki alanı adı kullanılmalıdır.
  • Etiket Yardımcıları@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Örnek indirmede Ürünler alanı aşağıdaki _ViewImports.cshtml dosyayı içerir:

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

Aşağıdaki işaretleme /Products/AboutRazor Sayfasını gösterir:

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

<h2>Products/About</h2>

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

Önceki dosyada, ad alanı ve @addTagHelper yönergesi dosya tarafından dosyaya Areas/Products/Pages/_ViewImports.cshtml aktarılır.

Daha fazla bilgi için bkz . Etiket Yardımcısı kapsamını yönetme ve Paylaşılan Yönergeleri İçeri Aktarma.

Sayfa Alanları için Razor paylaşılan düzen

Uygulamanın tamamı için ortak bir düzen paylaşmak için öğesini uygulama kök klasörüne taşıyın _ViewStart.cshtml .

Yayımlama Alanları

Wwwroot dizinindeki tüm *.cshtml dosyaları ve dosyaları, *.csproj dosyasına eklendiğinde <Project Sdk="Microsoft.NET.Sdk.Web"> çıkışa yayımlanır.