Asp.Net MVC’ ye Giriş – Controller ve Routing

Lafı uzatmadan konuya giriyorum. Önce boş bir Asp.Net Mvc projesi açıyoruz. Unutmadan, benim bilgisayarımda Mvc4 yüklü fakat şu anda ki en yeni versiyon Mvc5. Bu versiyon farkı bahsedeceğimiz konuyu etkilemiyor.asp.net-mvc-giris-figure1Projemizi oluşturduktan sonra Solution Explorer da (Şekil 3) Model, View ve Controller adında 3 farklı klasör görüyoruz. Bunlar bir önceki yazıda bahsettiğim düzeni sağlamak için ilgili yapının dosyalarını barındıracaklar. Hemen şunu da belirteyim elimden geldiğince konuyu küçük parçalar halinde anlatmaya çalışacağım. Bu sayede olayı kavramak çok daha basit olacaktır diye düşünüyorum ;)

Controllers klasörüne gidip Bolum1Controller adında bir sınıf (class) oluşturuyoruz. Sonrasında bu sınıfı System.Web.Mvc.Controller sınıfından inherit (miras) ediyoruz. Inheritance konusu nesne yönelimli programlamanın konusu (oop = object oriented programming) bundan dolayı üstünde çok durmayacağım. Bu kısım ile ilgili sadece şunu bilmeniz yeterli olacaktır. Mvc framework ünü yazan abiler bir tane sınıf yazmışlar adı Controller ve bu sınıfın içinde bazı tanımlar var. Bu tanımlara ihtiyacımız olduğu için kendi sınıfımızı bu sınıftan türetiyoruz. Yani public class Bolum1Controller : Controller { } şu şekilde. Eğer .net tarafında uygulama geliştiriyorsanız yada geliştirecekseniz, mvc den önce oop öğrenmenizde fayda var hatta bana soracak olursanız zorunlu. Aklınıza neden kendi sınıfımızın adını Bolum1Controller olarak ifade ettik sorusu gelebilir, aslında cevap çok basit. Mvc framework ü kaba tabirle sınıfın adında EndsWith(“Controller”) ile kontrol yapıp ona göre bu sınıfa muamelesini yapıyor, yani hımmm bu bir controller sınıfıymış gibi.. Tabi diğer bir sebep ise sınıfın adını gördüğünüz anda bunun bir controller olduğunu anlamanız, aslında beyinde endswith ile işi bitiriyor ;)

Sınıf isimlerini, değişkenleri, methodları isimlendirmek aslında çok önemli bir konu, yer yer bu konuda da bildiklerimi aktaracağım. Biz c# da camelcase denilen bir düzende yazıyoruz. Yani her kelimenin baş harfi büyük. Örneğin; KullaniciYorumlariniGetir gibi.. Burada ki başka bir konu ise isimlerin yapacakları işi anlatıyor olması. Koda baktığınızda neyin ne iş yaptığını, ne işe yaradığını adından çıkartabilmelisiniz, takım arkadaşınız çıkartabilmeli, 2 yıl sonra gelen insanda görünce olayı anlamalı. Haaa birde unutmadan şunu söyleyeyim c# Türkçe karakter kullanımına izin veriyor fakat siz kesinlikle kullanmayın. Bu işin doğasında tek bir dil var o da İngilizce.

Mvc ye geri dönüyoruz, Bolum1Controller sınıfımızın içine bir tane Index() adında, geriye ActionResult döndüren bir sınıf tanımlıyoruz.


public class Bolum1Controller : Controller
{
    public ActionResult Deneme()
    {
        return View();
    }
}

Buraya kadar yaptıktan sonra projemizi çalıştırıyoruz. Oops hata sayfası geldi (Sebebini aşağıda yazacağım Sebep 1). Adres satırına http://localhost:port/bolum1/deneme/ yazıyoruz. Şuna benzer bir hata göreceksiniz “‘deneme’ görünümü veya görünümün ana öğesi bulunamadı veya hiçbir görünüm altyapısı aranan konumları desteklemiyor.” Bu normal çünkü henüz View tarafına hiç bir şey yapmadık, mvc ilgili viewı arıyor ama bulamıyor. Burası şimdilik az bekleyecek, anlamamız gereken başka bir konu var.

İstekte bulunduğumuz adres aslında bizim kontrolümüzün ve bu kontrolün içinde ki deneme adında ki methodun ismi. Demek ki url den bizim hangi kontrolün hangi methoduna erişeceğimizi yöneten bir mekanızma var. İşte bu mekanızmanın adı Routing (yönlendirme). Muhtemelen aklınıza direkt şu soru geldi; iyi de kontrolün adını başka, url deki adını değişik yapmak istiyorum. Maalesef bunu yapamıyorsunuz, şaka şaka :D, aklınıza gelen – gelmeyen her şeyi rahatlıkla yapabiliyorsunuz. Routing konusuna ayrıca bir yazıda değineceğiz çünkü malum buda derin bir konu :) Aşağıda ki grafikte kabaca aletin çalışmasını görebilirsiniz.

Sebep 1: Bu durum şundan kaynaklanıyor. Site ilk açıldığında gelen sayfayıda (root (kök) http://localhost:port/) routing den ayarlayabiliyoruz. Bu ayar varsayılan olarak Home ve Index olarak ayarlanmıştır. Haliyle kontrolümüzün adını Bolum1Controller değilde HomeController yapıp, Deneme methodunuda Index yapsaydık bir problem olmayacaktı çünkü direk buraya yönlenecekti istek. Routing ile ilgili tanımlar App_Start / RouteConfig.cs dosyasının içinde. Şimdilik kurcalamayalım dediğim gibi ilerde kurcalayacağız.

Evet bu yazı ile birlikte inceden Controller ve Routing meselesi hakkında kafamızda bir şeylerin oluşmuş olduğunu umut ediyorum. Aslında inceden dememe bakmayın olayın kabası bu kadar. Bir sonraki yazı View hakkında olacak. Umarım faydalı olmuştur.