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 page
olarak başka bir yol parametresi action
controller
area
ekleyerek 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.cs
alan 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
- Home
- Denetleyici
- Hizmetleri
- Denetleyici
- HomeController.cs
- Görünümler
- Home
- Index.cshtml
- Home
- Denetleyici
- Ürünler
- Alanları
Ö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.
MVC alanlarıyla bağlantı oluşturma
Ö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ı, @using
ve @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
- Sayfa
- Hizmetleri
- Sayfa
- Yönetmek
- Hakkında
- Dizin oluşturma
- Yönetmek
- Sayfa
- Ürünler
- Alanları
Sayfalar ve alanlar ile Razor bağlantı 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 sayfaServices
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/Home
iç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
- Örnek kodu görüntüleme veya indirme (indirme). İndirme örneği, test alanları için temel bir uygulama sağlar.
- MyDisplayRouteInfo ve ToCtxString, Rick.Docs.Samples.RouteInfo NuGet paketi tarafından sağlanır. Yöntemler
Controller
veRazor Page
yönlendirme bilgilerini görüntüler.
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 page
olarak başka bir yol parametresi action
controller
area
ekleyerek 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 {
-
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
- Home
- Denetleyici
- Hizmetleri
- Denetleyici
- HomeController.cs
- Görünümler
- Home
- Index.cshtml
- Home
- Denetleyici
- Ürünler
- Alanları
Ö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.
MVC alanlarıyla bağlantı oluşturma
Ö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ı, @using
ve @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
- Sayfa
- Hizmetleri
- Sayfa
- Yönetmek
- Hakkında
- Dizin oluşturma
- Yönetmek
- Sayfa
- Ürünler
- Alanları
Sayfalar ve alanlar ile Razor bağlantı 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 sayfaServices
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/Home
iç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 page
olarak başka bir yol parametresi action
controller
area
ekleyerek 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 {
-
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
- Home
- Denetleyici
- Hizmetleri
- Denetleyici
- HomeController.cs
- Görünümler
- Home
- Index.cshtml
- Home
- Denetleyici
- Ürünler
- Alanları
Ö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.
MVC alanlarıyla bağlantı oluşturma
Ö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
- Sayfa
- Hizmetleri
- Sayfa
- Yönetmek
- Hakkında
- Dizin oluşturma
- Yönetmek
- Sayfa
- Ürünler
- Alanları
Sayfalar ve alanlar ile Razor bağlantı 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 sayfaServices
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/Home
iç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.
ASP.NET Core