|
Asp.Net MVC Framework - Route Kavramı |
|
Gönderiliyor lütfen bekleyin... |
|
|
Asp.Net MVC Framework ile uygulamaların en sık kullanılan özelliklerden biridir Asp.Net Routing. Sayfa çağrımlarında ve Controller ile haberleşme esnasında kullanılmaktadır. Proje içerisinde Global.asax dosyasına eklenmektedir. MVC uygulamalarında sayfa istekleri doğrultusunda yapılan işlemler routing temeli göze alınarak gerçekleştirilmektedir.
Asp.Net Route Kullanımı
MVC Framework ile geliştirilmiş olan web projesi şablonunda routing en temelde iki dosyada kullanılmaktadır. Bunlardan birincisi Web.config diğeri ise Global.asax dosyasındadır. Bu dosyalardan yer alan routing yapısı, son kullanıcılar tarafında yapılan istekler doğrultusunda Controller/Action/ID modelini ele alarak işlemesine olanak tanımaktadır.
Birincisi, web.config içerisinde bizlere sunulan dosyaları inceleyeceğiz. Bu bölümde Asp.Net Routing için konfigürasyonu yer almaktadır. Özellikle konfigürasyon dosyasında; system.web.httpModules ile ilgili seçimler, system.web.httpHandlers ile ilgili seçimler, system.webserver.Modules ile ilgili seçimler ve system.webServer.Handlers ile ilgili seçimler yer almaktadır. Config dosyasında yukarıda belirttiğimiz seçimleri silmemiz durumunda uzun zaman boyunca birçok işlem üzerine uğraşmamız gerekecektir. Bu sebepten ötürüdür ki silinmesi kesinlikle önerilmemektedir.
İkincisi ile uygulama içerisindeki Global.asax dosyasının içerisinde route table oluşturulmasıdır. Bu dosyada oluşturulan route yapısı Controller/Action/ID mantığını baz alarak oluşmuştur.
Global.asax
ausing System; using System.Collections.Generic; using
System.Linq; using System.Web; using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{ // Note: For instructions on
enabling IIS6 or IIS7 classic mode,
// visit
http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
// Route name
"{controller}/{action}/{id}",
// URL with parameters
new { controller = "Home", action = "Index", id = "" }
// Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
} } }
|
MVC uygulaması ilk başlatıldığında Application_Start() metodu çağırılır. Bu metodu RegisterRoutes() metodunu çağırır. RegisterRoutes() metodunda route table oluşturulmuştur. Kısaca uygulamamız ilk başladığı andan uygulamayı durdurana kadar geçen süreçte sürekli olarak Route Table işlemi gerçekleştirilmektedir.
Varsayılan Route Table isminde “default” geçendir. Bu tek yönlü yönlendirme olarak ta gösterilmektedir. Varsayılan Route Table ilk internet penceremizin adres çubuğuna yazılacak olan url için ilk olarak controller name ‘i alır. Bir sonraki parametre olarak action ‘ı üçüncü ve son parametre olarak da id parametresini almaktadır. Daha önce değindiğimiz MVC yazılarında da görmüş olduğumuz örnekleri de hatırlarsak veri tabanından yararlanarak gösterdiğimiz verilerin detaylarını göstermek istediğimizde ilişkisel olan controller name, bu istek doğrultusunda ne tür bir işlem yapılacağına ilişkin action name gelir. En son olarak ta çağırılan kayda ilişkin id değerinden yararlanarak istediğimiz gerçekleştirmiş olur.
MVC Framework kullanarak geliştirdiğimiz projeleri çalıştırdığımızda ve herhangi bir yere istekte bulunduğumuz adres çubuğuna yazılacak olan url aşağıdakine benzeyecektir.
/Home/Index/3
Yukarıdaki örneğimizi default Route map ‘i göz önüne olarak parçalara ayırırsak;
Controller = Home
Action = Index
Id = 87
Şeklinde olacaktır.
Bu durumda yapılan istek adres çubuğunda URL/Home/Index/3 biçiminde gözükecektir. Peki bu bize programlama konusunda nasıl bir istekte bulunmuştur. En temel mvc mantığını hatırlamak gerekirse, son kullanıcı tarafında yapılan istekler yapılacak iş (action) bazlı olarak gerekli olan controller sınıfına gönderilir. Sınıflarda ilişkili metod bulunarak işlem gerçekleşir ve devam tamamlanır. Bu durumda adres çubuğunda yer alan url home controller sınıfının içerisindeki Index metodunu bulur ve aşağıdaki biçimde işleyebilmesine olanak tanır.
HomeController.Index(87)
Bu işlem sonucunda sayfada 3 nolu kayda ilişkin veriler gösterilir (Tabii bu id sonucunda gerekli değerlerin gelmesi için bir işlem yapılmışsa).
HomeController içerisinde yer alan Index() metodunu incelemek gerekirse; Yapılan istek sonucunda iki türlü istek alabilmemiz mümkündür. Bunlardan birincisi ID alanının boş olması, ikincisi ise parametre almasıdır. Varsayılan olarak parametresiz gelmektedir. Bunun sebebi herhangi bir veri olmadığı durumlarda null tip almayan bir parametre kullanılırsa hata vereceğinden ötürüdür.
Varsayılan Index metodu aşağıdaki gibidir.
Controller\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{ [HandleError]
public class HomeController : Controller
{ public
ActionResult Index()
{
return View();
} } } |
Yukarıdaki kod parçasında da göreceğiniz üzere Index metodunda bir parametre alınmamıştır. Bu tür kullanımlarda ID istekleri es geçilerek işlem yapılacaktır.
Bir diğer kullanım seçeneği string parametre alarak kullanılmasıdır. Bu da değer gelmeme ihtimali olan durumlar için ideal bir kullanım seçeneğidir. Çünkü string te boş değer alarak işlem yapabilmektedir.
Controller\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{ [HandleError]
public class HomeController : Controller
{ public
ActionResult Index(string id)
{
return View();
} } } |
Bu tür kullanımlarda ID parametresi boş geçildiği durumlarda String.Empty değerini alır işlemini ona göre devam ettirir. Aksi durumda değer girildiğinde ise girilen değere göre işlem yapar.
Bir diğer kullanım şekli integer bir ID parametresi kullanmaktadır. Integer kullanımını da iki şekilde değerlendirmek gerekiyor. İlk olarak nullable tipteki parametreye göz atalım.
Controller\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{ [HandleError]
public class HomeController : Controller
{ public
ActionResult Index(int? id)
{
return View();
} } } |
Yine kullanıcı tarafında gelen istekte ID parametresinin boş geçilebilme ihtimalini düşünerek int olan id ‘yi nullable yaptık. Bu durumda eğer ki id parametresi boş gelirse bizden herhangi bir soru sormayacak ve varsayılan sayfaya yönlendirecektir. Aksi durumda ise alınan değere göre işlemi gerçekleştirecek ve bize istediğimiz sonucu sunacaktır.
Değineceğimiz son kullanım şekli integer tip alan bir parametre şekli olacaktır.
Controller\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{ [HandleError]
public class HomeController : Controller
{ public
ActionResult Index(int id)
{
return View();
} } } |
Bu tür kullanımlarda kullanıcı tarafından yapılan istekler doğrultusunda gerekli ID parametresini uygulama değerlendirerek istediğimiz sonucu verecektir. Fakat olumsuz bir yönü olmaktadır. Eğer ki gönderilen istekte Id parametresi yok ise sorun ile karşı karşıya kalmış bulunuyoruz. MvcAction sınıfı null tipleri kabul etmemektedir. Bu sebepten ötürü de kullanıcılar tarafında id parametresi boş olan bir istek gönderildiğinde uygulamamız hata verecektir. Hata mesajında ise yukarıda da belirttiğimiz gibi “kullandığınız tipin null değer alabilmesi gerekmektedir. Eğer ki bu tipi kullanmaya devam etmek istiyorsanız nullable bir tip kullanınız” şeklinde bir mesaj alacağız.
Genel olarak ilk konumuzu toparlamak gerekirse; MVC şablonu ile geliştirilen projeler sayfa yönlendirme işlemleri Asp.Net Routing ile yaptıklarını, web.config ve Global.asax içerisinde bilgilerinin tutulduğunu ve son olarak ta routing ‘e talepte bulunan metotların alabileceği tipleri incelemeye çalıştık.
Not: Yaptığınız işlemler sonucunda hala parametre almıyor ya da sayfa bulunamadı hatası veriyorsa oluşturduğunuz controller sınıfına ilişkin view ‘ı
oluşturarak sorunu çözebilirsiniz.
Custom Routing Oluşturma
MVC patterninin ile gelen en temel özelliklerinden biri olan Asp.Net Routingin temel olarak nasıl kullanılacağını detaylı olarak inceledik. Şimdi değineceğimiz konu ise bize sunulan Controller/Action/ID routing map ‘inin dışında harici bir routing ‘i nasıl oluşturacağımızdır.
Web uygulamaları geliştirirken kesinlikle sürekli olarak id parametresine göre işlem yapmayız. Başka bir yapı için başka bir parametre üzerinde de işlem yapabilmemiz mümkündür. Örneğin, makalelerin yayınlandığı bir topluluk sitesini düşünelim ve biz bu makaleleri id bazlı değil de tarih bazlı göstermek istiyoruz. Bu durumda MVC ‘nin bize varsayılan olarak sunduğu yapı işimize yaramayacaktır. Farklı çözümler üretmemiz gerekecektir. Bu durumda yapmamız gereken kendimize ayrı bir route map oluşturmak olacaktır.
Bu işlemi diğer route maplerinde bir arada olduğu Global.asax dosyası üzerinde gerçekleştireceğiz.
Gerçekleşecek işlem sonucunda Arsiv/25-12-2009 ‘u internet penceremizde adres satırına eklediğimizde istediğimiz karşılanmış ve sayfa getirilmiş olacaktır. Fakat unutulmaması gereken bir konu vardır ki tarihi DateTime tipinden çağıracağımız için tam olarak uygun bir veriyi uygulamaya göndermemiz gerekecektir.
Kendimize özel routing map eklediğimiz global.asax dosyası aşağıdaki gibi olacaktır.
Global.asax
ausing System; using System.Collections.Generic; using
System.Linq; using System.Web; using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{ // Note: For instructions on
enabling IIS6 or IIS7 classic mode,
// visit
http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Makale",
"Arsiv/{yayinlanmaTarihi}",
new { controller = "Arsiv", action = "Tarih" }
);
routes.MapRoute(
"Default",
// Route name
"{controller}/{action}/{id}",
// URL with parameters
new { controller = "Home", action = "Index", id = "" }
// Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
} } }
|
Makaleler uygulamamız için gerekli olacak route map oluşturulmuş durumdadır. Artık istediğimiz bir controller sınıfında oluşturacağımız
metotlar yardımı ile bunu kullanabiliriz. Kullanabileceğimiz örnek adres tiplerini yazmak gerekirse;
Arsiv/10-12-2009
Arsiv/19-07-1987
Arvis/MVC
Örnek olarak değerlendirilebilir. Fakat biz route ‘ı DateTime tipinden çağıracağımızı belirttiğimiz için Arsiv/MVC adresinde hata almamız yüksek ihtimaldir.
ArsivController.cs isimli controller sınıfımızı oluşturarak aşağıdaki metodu oluşturuyoruz.
Controller\ArsivController.cs
Controller\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{ [HandleError]
public class HomeController : Controller
{ public
string Tarih(DateTime? yayinlanmaTarihi)
{
return "Makalenizin yayinlanma tarihi" + yayinlanmaTarihi.ToString();
} } } |
Metod yardımıyla route ‘ı kullanabilmemiz mümkündür. Adres çubuğuna yanlış bir değer girmemiz durumunda ise girdiğimiz değeri dönüştüremeyeceğine ilişkin hata mesajını verecektir. Ayrıca null tip almasına karşında DateTime tipini nullable olarak belirtmemiz gerekmektedir.
DateTime tipinin dışında ve boş girdiğimiz değerlerde bize bu hata mesajını verecektir. Boş değer girdiğimiz zaman hata vermesini önlemek amacıyla yapmamız gereken en basit işlem nullable tip kullanmak olacaktır. Bu işlem sonucunda boş girdiğimiz anlar için hata mesajından kurtulmuş olacağız.
Routing i daha aktif bir şekilde kullanmamız ActionResult sınıfını da kullanarak işlemi yapmaktadır. Gerekli veri tabanı veya diğer işlemleri gerçekleştirdiğimizde bize gerekli sayfaya yönlendirir. Bu işlemler sonucunda da oluşturduğumuz custom routing yapıyı daha iyi kullanabilmemiz mümkün olacaktır.
Not: Yaptığınız işlemler sonucunda hala parametre almıyor ya da sayfa bulunamadı hatası veriyorsa oluşturduğunuz controller sınıfına ilişkin view ‘ı
oluşturarak sorunu çözebilirsiniz.
Route Oluşturma Kısıtları
Yazımızda şu ana kadar Route genel yapısını ve kendimize özgü route ları nasıl oluşturabileceğimizi incelemeye çalıştık.
Route table oluşturmak istediğimizde projemizin içerisinde yer alan global.asax dosyasının içerisine oluşturuyoruz. Ayrıca bu dosya içerisinde varsayılan olarak işlemlerimizde kullanmak üzere route map yer almaktadır. Şimdi ise route map oluştururken dikkat etmemiz gereken noktalara değinmeye çalışacağız.
İnternet tarayıcımız üzerinden istekte bulunduğumuzda işlemleri algılaması için gerekli yazım kuralları vardır. İlk olarak bu kurallara göz atalım.
Global.asax
ausing System; using System.Collections.Generic; using
System.Linq; using System.Web; using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{ // Note: For instructions on
enabling IIS6 or IIS7 classic mode,
// visit
http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Urun",
"Urun/{urunId}",
new { controller = "Urun", action = "Detay" }
);
routes.MapRoute(
"Default",
// Route name
"{controller}/{action}/{id}",
// URL with parameters
new { controller = "Home", action = "Index", id = "" }
// Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
} } }
|
Yukarıda verdiğimiz kod bloğu yardımıyla kısıtlarımızı açıklamaya başlayalım. İlk
kısıdımız route ismi ile ilgili. Örneğimiz için route ismi Urun ‘dür. Urun ‘u controller sınıfının isminden almaktadır. UrunController isimli controller sınıfının adı olan Urun kullanılmaktadır.
Controller\UrunController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{ [HandleError]
public class HomeController : Controller
{ public
ActionResult Detay(int urunId)
{
return View();
} } } |
Controller sınıfının içerisinde Route ile map edilmesi için hazırlanan metoda dikkat edelim. Bu tür
metotların oluştururken dikkat etmemiz gereken en temel koşul route table belirttiğimiz yolların tam olarak eşleşmesidir. Oluşturulan metodun adı ile route map de belirtmiş olduğumuz action ‘nın aynı olması ve action ile belirtilen şu parametre ile gelecek denilen değerinde aynı olması gerekmektedir. Bu tür hazırlanmış örnek yukarıdaki kod parçasında yer almaktadır.
Bu işlemlerimiz sonucunda internet penceremizin adres çubuğuna;
• URL/Urun/3
• URL/Urun/9
• URL/Urun/12121
Kabul edilirken,
• URL/Urun/Araba
• URL/Urun/10–10–2008
Kabul görmemektedir. Kabul görmeyen parametrelerden biri ile uygulamamızı denersek aşağıdaki gibi bir sonuç ile karşılaşırız.
Hatalı parametre girdiğimiz durumda “girdiğiniz parametreyi dönüştüremiyorum, parametre sonucunda parametrenize boş değer dönüyor” gibi bir mesaj vermektedir. Boş değer girme sorununu parametrenin tipini nullable girerek çözebiliriz.
Not: Yaptığınız işlemler sonucunda hala parametre almıyor ya da sayfa bulunamadı hatası veriyorsa oluşturduğunuz controller sınıfına ilişkin view ‘ı oluştururak sorunu çözebilirsiniz.
Yazımız boyunca MVC Framework ’te sıklıkla kullanılan Asp.Net Routing yapısını detayları ile incelemeye çalıştık.
Herkese mutlu günler diliyorum.
Turhal Temizer
[email protected]
http://turhal.blogspot.com
Makale:
Asp.Net MVC Framework - Route Kavramı ASP.NET Turhal Temizer
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|