- Area'lar, farklı namespace'ler ile ayrılmış, kendine ait routing ayarlarına ve MVC yapısına sahip alanlardır.
- Farklı amaçlar için farklı app gruplarına ihtiyacımız olduğu durumlarda kullanırız.
- Örneğin, bir sitenin ayrı bir müşteri paneli, admin paneli vb varsa, bu yapılar ayrı ayrı arealar oluşturularak kullanılabilir.
- Bir Core projesi içinde istenilen sayıda area açılabilir.
- Büyük projelerin bağımsız parçalarını birbirinden ayırarak yönetilebilirliği kolaylaştırır.
- Aynı isimle controller açılması, bu controller farklı arealar altında olduğu müddetçe sorun oluşturmaz.
- Core, area içindeki bir view'ı render ederken, default olarak aşağıdaki yollara bakar :
/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
/Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
/Views/Shared/<Action-Name>.cshtml
- Bu default yolları değiştirmek mümkündür.
- Bunun için
Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions
üzerindenAreaViewLocationFormats
kısmı override edilebilir. (Servise yapısı içinde)- Buradaki numaralandırma :
{0}
> Action Name{1}
> Controller Name{2}
> Area Name
- Buradaki numaralandırma :
services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/Categories/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Categories/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});
- Area kullanımı için basit olarak iki adımlı bir ayarlama yapmak gerekmektedir.
- Route ayarlaması
- Controllers ayarlaması
- Route ayarlaması için, yeni bir routeMap eklenmesi gerekmektedir.
- Bu yeni ayarlamanın diğer alanlarla çakışmaması için onların üstünde olması daha sağlıklıdır.
app.UseMvc(routes =>
{
routes.MapRoute(
name: "areaRoute",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
- Controller kullanımında, her controller sınıfının üstüne
Area
attribute'ü ile, hangi areaya ait olduğu belirtilmelidir.- Eğer bu ayarlama yapılmazsa, root dizinden türetilmiş gibi algılanır ve çakışma yaratır.
namespace MyStore.Areas.Products.Controllers
{
[Area("Products")]
public class HomeController : Controller
{
// GET: /Products/Home/Index
public IActionResult Index()
{
return View();
}
// GET: /Products/Home/Create
public IActionResult Create()
{
return View();
}
}
}
-
Program içinde başka bir action'a link yaratırken kullanacağımız yöntemler şunlardır:
-
Örnek olarak gideceğimiz link :
/Products/Home/Index
-
Aynı area ve controller, farklı action :
- HtmlHelper:
@Html.ActionLink("Go to Product's Home Page", "Index")
- TagHelper:
<a asp-action="Index">Go to Product's Home Page</a>
- HtmlHelper:
-
Aynı area, farklı controller ve action :
- HtmlHelper:
@Html.ActionLink("Go to Product's Home Page", "Index", "Home")
- TagHelper:
<a asp-controller="Home" asp-action="Index">Go to Product's Home Page</a>
- HtmlHelper:
-
Farklı area, controller ve action :
- HtmlHelper:
@Html.ActionLink("Go to Product's Home Page", "Index", "Home", new {area = "Products"})
- TagHelper:
<a asp-area="Products" asp-controller="Home" asp-action="Index">Go to Product's Home Page</a>
- HtmlHelper: