Merhaba arkadaşlar bu yazımda MVC mimarisinde Routing (Yönlendirme) nedir ve kendi route tanımlamalarımızı nasıl yapmamız gerektiğini inceleyeceğiz.
Ama önce Routing neydi bir hatırlayalım. ASP.NET Web Form kültüründe URL Rewrite, yani kullanıcının ve arama motorlarının sizin sitenizin URL'sinde anlamlı ifadeler görmesi için Handler yazarak konuya müdahele edebiliyorduk. Ancak her ne kadar iş görsede bu işlemler çok kolay değil ve gereksiz vakit kaybı yaratmaktaydı.
Microsoft MVC mimarisinde, Routing adı altında yeni bir düzenleme getirdi ve bize bu anlamda büyük katkıda bulundu.
Routing kodlarına projemizin Global.asax dosyasında RegisterRoutes metodunun altında ulaşabilmekteyiz.
RegisterRoutes metodunun içinde hali hazırda yer alan bir adet tanımlama göreceksiniz.
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Yukarıda MapRoute metodu kullanarak yeni route tanımlaması yaptık. Yanlarında ingilizce açıklaması yazıyor ama yine de biz bir inceleyelim.
-> routes nesnesi RouteCollection sınıfını temsil etmektedir.
-> MapRoute metodu URL'nizin şemasını ve bu URL şemasında hangi controller ve action'ın çalışacağı bilgisini tanımladığınız metotdur.
routes.MapRoute(
"Route'unuza vereceğiniz isimdir. Tekil(unique) olmak zorundadır",
"Bu Map Route'un hangi URL şemasına göre çalışacağı bilgisidir",
new { controller = "Hangi Controller'ın çalışacağını işaret eder. Örn. HaberController çalışacak ise Haber yazmanız gerekmektedir", action = "İşaret edilen Controller ın hangi action metodunun çalışacağını işaret eder."});
Projenizi geliştirmeye başladığınız zaman ihtiyaç doğrultusunda yeni route'lar tanımlamanız gerekecektir.
Örnek bir senaryo ile buna bir açıklık getirelim. Sitenizde haber yayınlıyorsunuz, dolayısıyla neye ihtiyaç var bir listeleme sayfası ve bir de detay sayfasına.
View klasörüne Haber adında yeni bir dizin ekleyelim ve içine Listele.aspx, Oku.aspx MVC View'larını ekleyelim. View'larımızı ekledikten sonra bunları karşılayacak Controller sınıfımızı da HaberController.cs olarak projemizde yer alan Controller dizinine ekleyelim. ve içerisindeki kodları aşağıdaki şekilde düzenleyelim.
public class HaberController : Controller
{
public ActionResult Listele()
{
//Listeleme kodları yazılacak
return View("Listele");
}
public ActionResult Detay(string HaberId)
{
//Detay kodları yazılacak
return View("Detay");
}
}
Dikkatinizi çektiyse Detay metodu HaberId adlı string bir parametre almaktadır. Aşağıda bu paremetrenin nereden geldiğini anlayacaksınız.
Şimdi Haber dizinini ve View'larını çalıştırabilmek için yeni bir Route tanımı yapacağız. Global.asax dosyamıza gidiyoruz ve aşağıdaki gibi düzenliyoruz.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"HaberListeleme",
"Haber",
new { controller = "Haber", action = "Listele" }
);
routes.MapRoute(
"HaberDetay",
"Haber/{id}",
new { controller = "Haber", action = "Detay" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
Yukarıda gördüğünüz gibi Default route'a ek olarak iki tane daha yeni route tanımladım. Bunlardan biri Listeleme için diğeri ise Detay için. Detay'ı tanımladığımız route'un ikinci paremetresinde "Haber/{id}" yazdığına dikkatinizi çekiyorum az önce HaberController'ın Detay metodunun aldığı HaberId isimli parametreden bahsetmiştik işte bu URL'ye, "Haber/" dedikten sonra yazılmışsa bu parametreye yüklenmektedir.
Yani url'mizde şöyle yazıyor ise:
http://www.doguhanaydeniz.com/Haber/345
işte buradaki 345 rakamı parametre olarak gönderilecektir.
Eğer route tanımlamamızı şu şekilde yaparsak :
routes.MapRoute(
"HaberDetay",
"Haber/{*Id}",
new { controller = "Haber", action = "Detay" }
);
yani parametre adımızın yanına * karakteri koyarak yazarsak Haber/ url sekmesinden sonra ne yazarsa yazsın Controller'daki Detay metodunun ilgili parametresine gönderilecektir.
Örneğin:
http://www.doguhanaydeniz.com/Haber/Turkiye/Guncel/34389
gibi bir URL istenirse Turkiye/Guncel/34389 parametre olarak gönderilecektir.
Route tanımlarken dikkat etmeniz gereken püf noktalardan birisi de yeni tanımladığınız route'u, default route'un üzerine tanımlamak zorunda olmanızdır. Diğer türlü denediğinizde hatalı çalıştığını farkedeceksiniz. Ki bunu anlamak için baya bir mesai harcamış biri olarak buna çok dikkat etmenizi öneririm.
Artık projemizi build edip çalıştırabiliriz.