Asp.NET MVC Area Oluşturma
Asp.NET MVC projelerinde standart dizin mantığının dışında, daha esnek bir yapı oluşturmamızı sağlayan Area yapısını inceleyelim.Web projelerimizde kullanıcıların dışında site yetkililerinin görebildiği administrator(yönetici) paneli, ya da kullanıcı rolüne göre ulaşılabilen alanlar bulundurmamız gerekebilir.Üzerinde çalıştığımız projenin içinde bu alanları temsilen klasörler oluşturup, bu klasörüler içinde MVC katmanlarını ve URL Routing şemasını eklememiz gerekmektedir.Bu durum haliyle bir programcı için işin teferruatı ve zahmetli yanıdır.Visual Studio bize bu alanları anında istediğimiz isimde oluşturma imkanı vermektedir.Şimdi bu iş nasıl yapılır inceleyelim.
İngilizce kelime olan “Area” nın Türkçe anlamı “Bölge” kelimesine eşdeğerdir.Yani konumuzun içeriğini bu terim özetlemektedir.Projede farklı bölgeler oluşturmak için Visual Studio derleyicisi bizlere yardımcı olacaktır.
Örnek amaçlı bir MVC projesi oluşturalım.Oluşturduğumuz projeye sağ tıklayıp “Add” seçeneğinden sonra “Area” sekmesine tıklayalım.

Karşımıza aşağıdaki gibi “Add Area” isimli bir pencere gelecektir.”Area name” alanına, bölgemizin yani dizinimizin ismini girelim.Ben projemde herhangi bir yönetim paneli tasarlayacağımı varsayıyorum ve Area mın adına “Yonetim” diyorum.

“Add” butonuna bastıktan sonra Solution Explorer penceresinden projemizi incelersek eğer, “Areas” adında bir klasörün altında, “Yonetim” adında bir dizin oluşturulmuş ve içine MVC(Model View Controller) katmanları eklenmiştir.

Dikkat ederseniz eğer, “Yonetim” adındaki klasörümüz altında “YonetimAreaRegistration.cs” adında bir klasör bulunmaktadır.Bu klasörü bi inceleyelim..
using System.Web.Mvc;
namespace MvcApplication8.Areas.Yonetim
{
public class YonetimAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Yonetim";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Yonetim_default",
"Yonetim/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}
Yukarıdaki kodları incelerseniz eğer, “AreaRegistraion” sınıfından türetilmiş “YonetimAreaRegistraiton” sınıfımızın içinde, override edilmiş “AreaName” adında bir property mevcut.Bu propertynin işlemini yukarıda görüyorsunuz zaten.Geriye, Area’mızın adını string bir biçimde gönderiyor.
Ayriyetten override edilmiş “RegisterArea” adında bir metodumuz mevcut.Bu metodumuzun içinde, Global.asax dosyamızdaki gibi, URL Routing işlemleri mevcut.Bu metod sayesinde, “Yonetim” adındaki Aria’mızın URL Routing yapısı şemalandırılmıştır.Dikkat ederseniz, “Yonetim/{controller}/{action}/{id}” satırında Controller alanından önce, Area’mızın ismi yazmaktadır.
Ama burada dikkat etmemiz gereken bir husus var.”Yonetim” adındaki Area’mızın bu URL Routing yapısını Global.asax dosyasında çalıştırmamız gerekmektedir.Bu işlemi yapabilmek için aşağıdaki kod bloğunun Global.asax dosyasında bulunan “Application_Start” isimli metodda çalıştırılması gerekmektedir.
AreaRegistration.RegisterAllAreas(); //Bu kod, projede ne kadar Aria varsa hepsinin URL Routing şemasını çalıştırması gerektiğini söyler.
Eğer Global.asax dosyamızı açarsak, “Application_Start” metodunda bu kod parçacığının varsayılan olarak yazıldığını göreceğiz.Yani Visual Studio bu güzelliğide bize yapmaktadır.
---Global.asax---
...
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
...
Şimdi oluşturduğumuz bu Area’nın çalışıp çalışmadığını bir deneyelim.
“Yonetim” Area’mız içinde, Controller katmanına “AnaSayfa(Controller)” adında bir sınıf oluşturdum.Haliyle, “Index” metodu varsayılan olarak geldi.Şimdide, View katmanında “AnaSayfa” adında bir klasörün altında “Index” metodunun dosayasını oluşturuyorum.
Projemizin Global.asax dosyasını incelersek eğer, ilk olarak “Home(Controller)” altındaki “Index” metodunun açılacağını söylüyor.(Her projede varsayılan olarak ilk böyledir)
Projemizi başlatalım, “Home(Controller)” Controller katmanındaki, “Index” metodu çalıştırılacak ve View katmanındaki dosyası açılacaktır.Tarayıcımızın adres çubuğuna, “http://localhost:****/Yonetim/AnaSayfa” URL yapısında link girersek eğer, “Yonetim” adındaki Area’mızın, “AnaSayfa(Controller)” adındaki Controller’ında bulunan “Index” metodu çalıştırılmış olacak ve View katmanındaki dosyası ekranda gözükmüş olacaktır.
Bu yazımızında sonuna gelmiş bulunmaktayız.
Faydalanmanız dileğiyle,
Bir sonraki yazımda görüşmek üzere..
İyi çalışmalar..

Çok sade ve yararlı bir anlatım olmuş teşekkürler Gencay hocam.
Rica ederim.Ben size teşekkür ederim Ekrem Bey.
Bende şöyle bir sıkıntı var nasıl çözebilirim.
Site ön yüzünde Product Controller ve List Action var.
Aynı şekilde AdminPanel Area da da Product Controller ve List Action var.
AdminPanel deki Product controller a girdiğimde Önyüzdeki Product controller açmaya çalışıyor.
Bunu nasıl çözebilirim.
Şuna bi bak… Öyle konuşalım…
Link vermeyle ilgili bir problemim yok.
Ön yüz linkleri
**.com/Sayfalar/Listele
Panel linkleri
***.com/Admin/Sayfalar/Listele
admin sayfalar listeye girdiğimde ön taraftaki listeleyi açamaya çalışıyor.
Yalnız şöyle bir durum söz konusu.
Breakpoint koyuyorum admin deki controller a gidiyor.
Ön yüzdeki controllere gitmiyor.
Ama önyüzdeki action ı açıyor.
Hmm… Düşündümde şunlar olmuş olabilir…
Eğer bu şekilde teorik devam etmeden net bir tespit yapmamı istiyorsanız yukarıda adı geçen iki dosyanında içeriğini buradan paylaşmanızı tavsiye ediyorum.
Sevgiler…
Filanca route içinde controller isimleri arasında “Login” var.
Ön tarafta da AjaxController var ve içinde Login action var.
Ajax/Login i üye girişinde kullanıyorum.
Fakat Ajax/Login e girdiğimde, Flianca daki route u baz alıyor ve admin in login sayfasını gösteriyor.
BaseConroller olaylarında bir sorun olabilir dedim fakat hepsini kontrol ettim. Admin in base’i ayrı öntarafın base’i ayrı.
Filanca da area yı da tanımladım.
Bu FilancaAreaRegistration.cs
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "{area}/{controller}/{action}/{id}", new { area = "Admin", action = "Index", id = UrlParameter.Optional }, new { controller = "Tools|Proccess|Brand|Category|Content|Contracts|Customer|Home|Order|Product|Settings|Showcase|Slider|Statistics|Login|Advertisement|Page|Store|BankAccount|SocialMediaLink|Shipping" }, new[] { "ECommerce.Web.Areas.Admin.Controllers" } ); context.MapRoute( name: "AdminDefaultRedirect1", url: "Admin", defaults: new { area = "Admin", controller = "Login", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "ECommerce.Web.Areas.Admin.Controllers" } ); }Bu da RouteConfig.cs
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapMvcAttributeRoutes(); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "ECommerce.Web.Controllers" } ); }Bir sebeple yazılım sanki önce FilancaRoute ı kontrol edip, eğer Filanca da yok ise RouteConfig i kontrol ediyor.
Ama şu enteresan xx.com/Ajax/Login e giriyorum. /Panel/Login/Index i gösteriyor.
Filancaya aşağıdaki kodu ekleyiniz.
public override string AreaName { get { return "bb_yonetim"; } }ve MapRoute’unuzun aşağıdaki formatta olmasına dikkat ediniz.
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "isim", "bb_yonetim/{controller}/{action}/{parametre}", new { action = "Index", controller = "Home", parametre = 3 } ); }Kolay gelsin.
Zaten o şekilde
public override string AreaName { get { return "Admin"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { action = "Index", controller = "Home", id = UrlParameter.Optional } ); }Hiç bir şey anlamadım link http://www.site.com/Admin/Product/List
olmasına rağmen
http://www.site.com/Product/List
sayfasını açmaya çalışıyor.