Bir ASP.NET MVC Deneyi
Hafta sonu sıkıldık diyelim. İşte güzel bir vakit geçirme teklifi. Bakalım ASP.NET MVC pişmiş mi bir tadına bakalım.
Teknoloji bıraktığımız yerde değil, mütemadiyen tekâmül ediyor. ASP.NET çıkınca çok ilgi göstermiştik. Şimdi bakıyoruz geriye, kaç sene oldu. Meraklısına yeni ortamlar lâzım. Sağolsun Microsoft'un ürünlerindeki bir sonraya bırakılmış çözümler bu beklentiyi her zaman sıcak tutuyor. ASP.NET için de öyle oldu denilebilir. Gelinen noktada, klasik ASP.NET ile geliştirmenin çoğu durumda isteneni karşılamadığı, mimâri olarak geliştiricinin önünü tıkadığı yüksek sesle konuşulur oldu. Bu sesler Microsoft tarafından da dinleniyordu muhakkak ve onlar da MVC yaklaşımını ASP.NET sisteminin içine gömdüler. Daha doğrusu gömecekler de prova yapıyorlar.
Bu yazımızda, çay-kahve-çorbamızı alıp şu yeni MVC ne menem bir şeymiş, ona eğileceğiz. Umarız, zevkli bir teknik yazı olur ve biz de memnuniyetle yayımlarız. Vira bismillah!
Girizgâh
MVC Nedir?
MVC sâir kereler yazıldığı gibi Model-View-Controller ifadesinin kısaltması olup daha çok web uygulamaları geliştirmede rehberlik edecek mimari bir kalıptır. Bir çok fikir gibi önce Java âleminde popüler olup sonra da .NET âlemine sıçrayanlardan birisi. Tekrara düşmemek için size birkaç link savurup MVC'ye giriş kısmını geçelim:
- Wikipedia'da MVC maddesi
- Vikipedi'de MVC maddesi
- Taner'in okulumuzun bahar etkinlikleri için hazırladığı MVC sunumu.
ASP.NET MVC Nedir?
Bu konuda da üç aydır oluşan bir bilgi birikimi mevcut. Hâzır olanı kullanmak programlamadaki temel prensiplerimizden biriyken, neden bunu yazı yazarken kullanmayalım. Hadi size birkaç link daha:
- ASP.NET MVC ve Düşündürdükleri
- İlk ASP.NET MVC Kod Örnekleri
- Scott'un ASP.NET MVC serisinin ilki.
Deney İçin Hazırlık
- Makinenize ücretsiz dağıtılan Visual Web Developer 2008 Express Edition'ı (VWD) kurun. Şimdi sizi masrafa sokmayalım Visual Studio 2008 Team Suite kurdurup.
- Yukarıdaki kurulumun üzerine geçenlerde duyurulan ASP.NET 3.5 Extensions kurulumunu geçin.
İşlem tamam demektir. VWD 2008'i açıp "New Site" dediğinizde aşağıdaki manzara var ise oturup üzerinden konuşabiliriz demektir :
Projeyi Oluşturmak
VWD'den yeni bir "ASP.NET 3.5 Extensions Web Site" açmamız lâzım. İlk açılışında pek bir malzeme olmuyor projede. Default.aspx ve web.config var; az ve öz. Biz default.aspx'i biraz değiştireceğiz. Öncelikle C# kod sayfasını (default.aspx.cs) silelim. Sonra da default.aspx'in içini boşaltalım. Boş olunca VWD kızıp durabilir, hiç olmazsa bir HTML comment ekleyebiliriz:
Global.asax
Global kodlar yazdığımız bu sayfa hâlâ önem arzediyor. Projeye global.asax ekleyip içine garip şeyler yazacağız:
System.Web.Mvc yeni "namespace"imiz olarak ışıl ışıl yanıyor gördüğünüz gibi. Ondan sonra RouteTable diye bir şeye yeni "Route"lar eklediğimiz dikkatinizi çekecek. Kodun maksadı, [controller]/[action]/[id] formatında gelen URL'lerdeki bilgilerin nasıl ayrıştırılıp kullanılacağını belirlemek. Route ifadesi de, bu bilginin ayrıştırılıp HTTP isteğinin uygun Controller sınıfının Action nitelikli metoduna yönlendirilmesi işi söz konusu olduğu için kullanılmış. Bir başka deyişle URL'den metoda yönlendirme kuralları tanımlanıyor burada.
Sözdizim C# 3.0'a bulaşmayanlara yabancı gelecektir. Nesne hazırlayıcılar ve anonim tipler denen yeni özellikler kullanılmış.
URL yönlendirmelerini tanımlamakla ilgili Scott Bey'in URL Routing başlıklı makalesi doyurucu bir kaynak. Yine detaylardan kaçtık gördüğünüz gibi.
Controller
Projemize App_Code klasörü ekleyelim. Bu ASP.NET 2.0'den beri kullandığımız özel bir klasör adı. Bu klasör içerisindeki kod dosyaları dinamik olarak ilk istekle derleniyor.
App_Code altına HomeController adıyla bir C# sınıfı da ekleyelim. Henüz içine bir şey yazmadık, projenin vaziyeti şu:
HomeController, bizim ilk kontrolörümüz. Şimdi ona bezeyeceğimiz kod bakınız:
Dikkat edeceğimiz noktalar:
- Kontrolörümüz System.Web.Mvc.Controller isimli bir özel sınıftan türüyor.
- "Index" ve "About" isimli metodlarımıza yine aynı "namespace"e mensup ControllerAction niteliğini vermişiz.
- Metodlarımız RenderView diye gizemli bir metodu çağırıyor. Ancak ikisinde de parametreler değişiyor.
Bakalım neler olacak? Devam ediyoruz.
View
View kısmı için projeye "Views" ve içine "Home" klasörü eklemeliyiz. İllâ adları "Views" veya "Home" olmak zorunda değil ama MVC'miz öntanımlı olarak bu formatı kullanıyor. Kontrolör ismiyle "View"lar bu şekilde eşleşiyor. Bir sonraki sürümde bu ilişki yapısı özelleşebilecek.
"Home" klasörü içerisine iki adet aspx ekleyelim: "index.aspx" ve "about.aspx". Bu deneysel sitemizin iki "view"i olacak anlamına geliyor. Aspx'leri eklerken bu seferlik tek dosya olarak ekleyelim. Yani kodu ayrı bir C# sınıfında bulunmasın.
Proje ağacımız şöyle oldu:
Şimdi "index.aspx"in biraz kimyasını bozacağız:
Onu altı çizgili sınıftan (ViewPage) türeyen bir sayfa yaptık. Bu, index.aspx'in bir "View" olabilmesi için gerekli. Sayfamızda başka da özel bir şey yok. Her şey sıradan.
About.aspx'te de benzer bir değişiklik yapalım:
Run MVC, Run!
Şimdi gelelim heyecanlı kısma: bu sayfaları çalıştırmak. "F5"ten önce, projenin başlangıç özelliklerinden "şu sayfayı çalıştır" tercihini aktifleştirip karşısındaki değeri de boş bırakmanızı tavsiye ederim. Böylelikle proje başladığında uygulamanın kök dizininden başlayacaktır:
Bu devirde IE 6 kullanan kaldı mı diyor olabilirsiniz. Var efendim demek ki.
Kök dizinimizdeki "default.aspx"i hatırlarsanız içinde hiçbir malzeme yoktu. Nasıl oldu da bizim ta nerelerdeki "index.aspx"imiz "render" oldu? Cevap MVC'de efendim. Global.asax'a yazdığımız şu "Route"u hatırladınız mı?
RouteTable.Routes.Add(new Route
{
Url = "Default.aspx",
Defaults = new { controller = "Home", action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
Açık açık "default.aspx" diye gelecek bir URL'yi "Home" kontrolörümüzün "Index" metoduna gönder diyoruz.
Ya URL'i /home/index yaparak denersek:
Hemen tahmin edeceğiniz gibi bu URL alternatifinde global.asax'a yazdığımız ilk "Route" tanımı devreye girdi. Neydi o?
RouteTable.Routes.Add(new Route
{
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
/home/about URL'i de tanıdık bir netice veriyor:
Bozmak da kolay:
Ana sayfamızda bir eksik gözünüze çarpmıştır. Hakkında sayfasına bağlantı yok. Onu maksatlı olarak sona bıraktık. Klasik olarak linki şu şekilde verelibiriz:
Ama bunun yerine daha yapısal bir metod kullanalım. "ViewPage" temel sınıfı bize "HtmlHelper" türünde bir yardımcı nesne sağlıyor:
Netice:
Toparlayalım
Pazar günümüzü bu MVC deneyiyle geçirdik. Faydası ne oldu?
ASP.NET'in kasvetli havasının biraz dışına çıkıp tertemiz XHTML çıktılarına doğru yelken açacağımız bir mimariye giriş yaptık. Model-View-Controller üçlemesinden sadece Model'i kullanmadık ama sabredelim, bir gün o da olur.
Bilinmesi gereken bir şey var ki ASP.NET MVC hâlen geliştiriliyor. Eklenecek bir sürü özellik var. Bunlar tamamlandığında konforlu bir MVC ortamı olacağı kesin. Bir ASP.NET projesine başlayacak kişiler için de önlerine ikinci ve güçlü bir yol olarak dikilecek.
MVC ile.













