İlk hazırladım MVC başlangıç dokümanından sonra (http://tuncgulec.com/mvc-projeolusturma/ adresinden indirilebilir) ikinci olarak bu oluşturduğumuz projenin benzeri, database işlemlerini yapan bir mvc projesi oluşturmak. Önceki yazımı okuduğunuzu var sayarak işlemlere geçmek istiyorum. İlk amaçlarımızdan biri kendi Entitymizi yazmak olacak. Bunun çok daha hızlı olduğunu ve gerekli gereksiz inherintence den kurtulduğumu göreceksiniz. Büyük işlerimizin yapıldığı classlarımızı yine Models altında kendi isimleriyle toplayacağız. Örneğin kullanıcı ile ilgili olan işlemleri kullanıcı classında biriktirip oradan toplayacağız. İlk olarak database bağlantımızı sağlayan classımızı yazdık. Bu claası db.cs isminde models klasörü altında oluşturduk. Daha öncede belirttiğim gibi büyük işleri yapan classlarımız burada toplayacağız. Görünüm aşağıdaki gibi olacaktır. Bu classı biraz açıklamak gerekirse, tam olarak şu işleri yapıyor. Veritabani isimde erişim belirleyicisi public olan bir class tanımladık. Ve bu classın bir kurucu methodu var. Kurucu method neydi hatırlatayım. Class sınıfından inherit alan bir nesnenin create edilme esnasında, yani kullanıma hazır hale getirilmesi esnasında çalışmasını istediğimiz kodları yazdığımız yere kurucu yani constructor method diyorduk. Özetle bir class create edilir edilmez çalışmasını istediğimiz kodları yazdığımız yerdi kurucu method. Kurucu methodun kurucu olabilmesi için bazı kurallar vardı. Bunlardan biri class ile aynı isimde olması diğeri erişim belirleyicilerinin de aynı olmasıydı. Yani class public ise kurucusu da public olmalıydı. Bu kurucu method ne yapıyor peki. Bu class creat edilir edilmez database bağlantısını yapmaya çalışıyor ve eğer bağlantı sağlanırsa bize out ile bir değer döndürüyor. Bağlı ise true, değilse false döndürüyor. Peki kurucu method olmasa ne olurdu. Kurucu method içine yazdığım kodları başka bir method altına yazmam ve database bağlantısını sağlamak için o methodu çağırmam demekti. Bu da bana database bağlantısı sağladığım her kod satırında ek kod maliyeti olarak geri dönecekti.
Tam olarak şöyle. Kurucu methodum olmasaydı ve bu bağlantı kodunu bir başka methoda yazmak zorunda olsaydım şöyle olacaktı. veritabani vt = new veritabani vt(); vt.baglan(); Evet ilk bakışta sadece kırmızı ile belirtilen kod parçacığı fazla gibi görünebilir. Ancak bunun her bağlantı gerektiği alanlarda kullandığınızı düşünün, onlarca satır kod fazlası olacaktı. Biz kurucu method ile bunu sadece veritabani vt = new veritabani vt(); diyerek kullanabiliyoruz. Db.cs dönecek olursak, veritabani isimli class create edilir edilmez database bağlantısı sağlamaya yarayan kodlarımız çalışacaktır. (Kendi örneklerinizde yapabilmek için public SqlConnection baglantimiz = new SqlConnection("Data Source=.;Initial Catalog=dbLoginMvcTest; Integrated Security=SSPI;timeout=10000");) Satırı kod bloğundaki tırnak içindeki Catalog yazan yerdeki = işaretinden sonra kendi database adınızı vermelisiniz. Şimdi diğer bir adım database içinde bir tablo oluşturmak. Benim tercihim MsSql oldu. Oysa VS nin her database bağlantı kurma yeteneği mevcut. Bazılarında ek kütüphaneler, apiler gerekebilir. Tablonuzda aşağıdaki resimde olduğu gibi alanlar olmalı. Tabloyu tamamladıktan sonra sayfalarımızı oluşturmaya geçelim. Üç sayfamız olacak. Birincisi anasayfamız, diğeri giriş formunun olduğu sayfa, diğeri giriş yapan kullanıcının görebileceği özel bir sayfa. Bu sayfaya giriş yapmayan kullanıcıların görmesini erişmesini engelleyeceğiz. Bunun yolu da session kurallarından geçiyor. Bu nedenle dilerseniz önce sessionlarımızı ayarlayalım. Bunun içinde global.asax dan yararlanacağız. Global.asax varsayılan olarak sadece bir method ile geliyor. Oysaki webform uygulamalarında bu dosya eklendiğinde tüm hazır methodları ile birlikte geliyordu. Bunlardan biride Session_Start methoduydu. Bize gerekli olan da tam olarak bu method. Burada olmaması bize engel değil. Bizde ekleyebiliriz.
Yukarıda görüldüğü gibi Session_Start methodu yok. Eklendikten sonraki hali aşağıdaki gibi. Bu komutu biraz açıklamak istiyorum. Kullanıcının giriş yapıp yapmadığını kontrol edeceğimiz session adı kullanici_id isimli sessiondır. Burada sessionın daha önce oluşturup oluşturulmadığını
kontrol etmemiz gerekir. Integer bir değer taşıyan sessionlar her ne kadar kendilerine atandıkları değeri taşıyabilseler de birer objedir. Bizim kontrol edeceğimiz değer bir integer değer olduğundan bunu kontrol ederken hata almamız kaçınılmazdır. Çünkü değeri atanmayan bir session henüz obje olacağından ve biz bunu kontrol ederken integer olarak sorgulayacağımızdan, objeyi integera dönüştüremediğinden hata verecektir. Bizde bu hataya engel olmak için oturum başladığında, yani Session_Start olduğunda, kontrol edeceğimiz sessiona varsayılan bir değer atıyoruz. Bu da etkisiz elaman olacağını düşündüğümüz 0 değeridir. Sayfalarımızı ekleyelim. İlk Sayfamız Home altında index.cshtml. (Eğer bu adımı bilmiyorsanız ilk dokümanı inceleyiniz. http://tuncgulec.com/mvc-proje-olusturma/) Sonra yine Home altında GirisFormu ve BanaOzel diye iki view oluşturalım. Sayfaları oluşturmamız bittikten sonra browserdan adres satırının sonuna Home/banaozel yazdığımızda giriş yapılmadan dahi sayfanın görüntülendiğini göreceksiniz. Bunun nedeni sessionlarla herhangi bir kontrol yapmamamızdır. İlk önce bu sorunu giderelim. Giriş yapmayan kullanıcıların bu sayfayı görmesini engelleyelim. BanaOzel.cshtml sayfası içine aşağıdaki kodları yazalım. Görüntü aşağıdaki gibi olacaktır.
Dikkat ettiğiniz üzere sessionın değerine direkt ulaşamadık. Type Cast yapmak zorunda kaldık. Bunun nedeni yukarıda bahsettiğim sessionların birer obje olmasıdır. Bu kontrolü koyup çalıştırdıktan sonra BanaOzel sayfasına ulaşamadığımız, direkt anasayfaya yönlendirildiğimizi göreceksiniz. Şimdi sırada kullanıcının tüm işlemlerini içeren methodları barındıran bir class yazmak. Bu class sadece kullanıcılarla ilgili işlemleri barındıracak. Dağıtık çalışmayacağız. MVC bir nevi düzenli olmaya zorluyor elbette. Models üzerinde sağ tuşa basıp kullanici isminde bir class ekleyelim.
Bu classı ekledikten sonra başındaki namespace leri kaldırıyoruz. Zorunlu değil. Ancak bu classı başka bir yerde kullanmak istediğinizde sorun yaşamayacaksınız. Classa ait giriş methodunu yazdık. Bu method giriş başarılıysa bize true değilse false döndürecek. Ne out ile nedenini döndürecek. Şimdi de controller içine bu classı kullanan methodumuzu yazalım. Unutmayın buraya yazacağımız method çok az satır kod olacak. HomeController içindeki giriş yapacağımız method form bilgilerini post yöntemi ile alacağı için methodumuzun tipini [HttpPost] tipinde yapacağız. Yazdığımız method aşağıdaki resimdeki gibi olacak.
Yukarıdaki resimde açıklamam gereken yerler aşağıda sıralanmıştır. 1) Girilen bilgileri, işlemi yapan methoda post yöntemi ile göndereceğimizden using ile başlayan bu düzenli komut satırını yazdık. Html.Beginform methodu 4 parametre ile çalışır, ilk ikisi string değişken alıyor. 2) ActionName dir. Action name HomeController altına yazdığımız aşağıdaki karşılayıcı methoddur. Ancak şimdilik bu methodun içini yazmadık. public ActionResult GirisYap() { } 3) ControllerName dir. Bu da karşılayıcı methodun yani 2. Olarak belirtilmiş methodun bulunduğu controller adresidir. 4) Doldurduğumuz bilgilerin hangi yöntem ile gönderileceğini belirtiyoruz. GET / POST Formun içeriğine de iki input oluşturdum. Şimdi GirisYap isimli karşılayıcı methodumuzun içini yazalım. Kodlarımız aşağıdaki gibi olacak.
Projeyi çalıştırdığımızda giriş formuna giderek giriş yapmayı deneyelim. Butona bastığımızda bu ekranda kaldığımızı gözlemleyeceksiniz. Tablomuza giderek bir kullanıcı ekleyelim. Daha sonra banaozel view gidelim ve kodlarımızı düzenleyelim. Tabloya eklediğimiz kullanıcı bilgileri ile giriş yapmaya çalışalım. Görüntü aşağıdaki gibi olacaktır.