11 Ocak 2016 Pazartesi

Custom Server side Validation (Ozel doğrulama sınıfı oluşturma)

Bir önceki yazımız olan (MVC Server side Validation) devamı niteliğindedir.
Kendimize doğrulama sinifi olusturup bunlarıda istediğimiz zaman kullanabiliriz.
Bunun için öncelikle ana dizinde bir klasor aciyoruz ve ismine Validations diyoruz
içerisine iki tane sinif ekliyoruz
1.AdSoyadValidation

public class AdSoyadValidation : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == null) // Checking for Empty Value
{
return new ValidationResult("Lutfen Ad/Soyad alanını doldurunuz");
}
else
{
if (value.ToString().Contains("@"))
{
return new ValidationResult("Ad/Soyad alanı @ karakter içermemelidir.");
}
}
return ValidationResult.Success;
}
}
2.NumericValidation
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false)]
public class NumericValidation : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == null || value.ToString().Length == 0)
{
return ValidationResult.Success;
}int i;
return !int.TryParse(value.ToString(), out i) ? new ValidationResult(ErrorMessage) : ValidationResult.Success;
}
public int ObjectId { get; set; }
}
public class NumericValidationValidator : DataAnnotationsModelValidator
{
public NumericValidationValidator(ModelMetadata metadata, ControllerContext context, NumericValidation attribute)
: base(metadata, context, attribute)
{
if (!attribute.IsValid(context.HttpContext.Request.Form[attribute.ObjectId]))
{
var propertyName = metadata.PropertyName;
context.Controller.ViewData.ModelState[propertyName].Errors.Clear();
context.Controller.ViewData.ModelState[propertyName].Errors.Add(attribute.ErrorMessage);
}}}
3.Calisanlar sinifimizin içeriğini düzenliyoruz
 public class Calisanlar
{
//[Required(ErrorMessage = "Adını giriniz!")]
[AdSoyadValidation] 
[Key]
public string Ad { get; set; }

[StringLength(5, ErrorMessage = "Soyadı alanı beş karakterden fazla olamaz")]
[AdSoyadValidation]
public string Soyad { get; set; }

[Required(ErrorMessage = "Maaş alanını giriniz")]
[NumericValidation(ErrorMessage = "Lutfen rakam giriniz!!")]
public int Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
}
Daha sonra unutmamamız gereken nokta ana klosör de bulunan global.asax sınıfının Application_Start() methoduna aşağıdaki kodu ekliyoruz
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(NumericValidation), typeof(NumericValidationValidator));
Ve çalıştırıyoruz böylece costom olarak oluşturduğumuz doğrulamayı kullanıyoruz.(daha onceki yazımızda kullandigimiz EkleCalisan.cshtml sınıfında deneme yapıyoruz)

10 Ocak 2016 Pazar

Blogger içerisinde html/javaScript Code yazmanın kısa yolu

Evet blog yazıları yazarken html ve javascript kodlarınıda yazmak isteriz çoğu zaman. Fakat bunları yazdığımızda tarayıcılar yazdığımız kodları yorumlayıp bize çıktısını üretir. Bundan kurtulmanın basit yöntemi:
>yeni bir notepad sayfası aciyoruz
>kodumuzu bu sayfanın içerisine kopyalıyoruz
>ctrl-H ile aranan içeriğe >değiştirilecek içeriğe ise < yazıyoruz
ve son olarak uyguladıktan sora kodu kopyalayıp istediğimiz blogger sayfasına yapıştırıyoruz.
iyi çalışmalar.

MVC Server side Validation (Sunucu Tarafında Doğrulama)

1. Model Klasörün içerisindeki çalışanlar sınıfımızı açıyor ve şu şekilde düzenleme yapıyoruz
public class Calisanlar
{
[Required(ErrorMessage = "Adını giriniz!")]
[Key]
public string Ad { get; set; }
[StringLength(5, ErrorMessage = "Soyadı alanı beş karakterden fazla olamaz")]
public string Soyad { get; set; }

//[DisplayName("Maaş")]
[Required(ErrorMessage = "Maaş alanını giriniz")]
//[RegularExpression("\\d+", ErrorMessage = "Maaş alanına rakam girmelisiniz")]
[Range(0, int.MaxValue, ErrorMessage = "Maaş alanı pozitif bir sayı olmalıdır")]
//[RegularExpression(@"[0-9]*$", ErrorMessage = "Please enter a valid number ")]
public int Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
}

2. Çalışanlar controllerındaki KaydetCalisan methodumuzu duzenliyoruz.
switch (btnGonder)
{
case "Çalışan Kaydet":
if (ModelState.IsValid)
{
CanliSatisBal canliSatisBal = new CanliSatisBal();
c.BaslamaTarihi = DateTime.Now;
canliSatisBal.KaydetCalisan(c);
//çalışanı kaydediyoruz ve index sayfasına yonlendiriyoruz
return RedirectToAction("Index");
}
else
{
return View("EkleCalisan");
}
case "İptal":
return RedirectToAction("Index");
}
return new EmptyResult();
3. EkleCalisan.cshtml icerigini duzenliyoruz tablo yapısını kullanacağız. Body etiketleri icerisine aşağıdaki kodu ekliyoruz head içerisinde yazdığımız scripti kaldırmiyoruz.
<div>
<form action="/Calisan/KaydetCalisan" method="post">
<table>
<tr>
<td>
Adı :
</td>
<td>
<input type="text" id="TxtAd" name="Ad" value="" />
</td>
</tr>
<tr>
<td colspan="2" align="right">
@Html.ValidationMessage("Ad")
</td>
</tr>
<tr>
<td>
Soyadı :
</td>
<td>
<input type="text" id="TxtSoyad" name="Soyad" value="" />
</td>
</tr>
<tr>
<td colspan="2" align="right">
@Html.ValidationMessage("Soyad")
</td>
</tr>

<tr>
<td>
Maaş:
</td>
<td>
<input type="text" id="TxtMaas" name="Maas" value="" />
</td>
</tr>
<tr>
<td colspan="2" align="right">
@Html.ValidationMessage("Maas") 
</td>
</tr>

<tr>
<td colspan="2">
<input type="submit" name="btnGonder" value="Çalışan Kaydet" />
<input type="submit" name="btnGonder" value="İptal" />
<input type="button" name="btnReset" value="Reset" onclick="ResetForm();" />
</td>
</tr>
</table>
</form>
</div>
Ve F5 ile çalıştırıyoruz.
Eğer ki aşağıdaki hatayı alırsanız
“The model backing the 'CanliSatisDal' context has changed since the database was created. Consider using Code First Migrations to update the database.”
Global.asax sınıfının içeriindeki Application_Start methoduna aşağıdaki kodu ekliyoruz
 Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
Aynı zamanda Package Manager Console dan
PM> enable-migrations yapmayı unutmuyuruz.

9 Ocak 2016 Cumartesi

MVC Kayıt Ekleme-Düzenleme-Silme

Bu günkü yazımızda bir önceki listelediğimiz verilerimize yeni veriler eklemeyi, güncellemeyi ve silme işlemlerini yapacağız.
Visual studiomuzdan projemizi açıp kaldığımız yerden devam ediyoruz.
1.CalisanlarController içerisine yeniCalisan adinda bir method ekliyoruz
public ActionResult YeniKayit()
{
return View("EkleCalisan");
}
2.View->Calisan içerisine EkleCalisan adında yeni bir view ekliyoruz









3.Yeni kayıtlar için Index view içerisine bir link koyuyoruz.
   a href="@Url.Action("YeniKayit", "Calisan")" class="elements">Yeni Kayıt a
Ve index sayfamızdan oluşturdugumuz linke tıklıyoruz bu bizi yeni kayıt ekleyeceğimiz sayfaya yönlendiriyor.

Evet kullanığımız Form etiketlerin amacı ne olabilir?
Web uygulamaları masaüstü yazılımları gibi event programlama değidir. Burada server ile haberleşme işlemi devreye girer. Kullanıcılar istekte bulunurlar server ise bunlara cevap döner. Form etiketleri html de istek göndermenin bir yöntemidir. Bu form uzerindeki kaydet butonu da bizim için bir istek gonderir.

Form etiketlerin method özellikleri nelerdir?
İstek -get-post-put-delete olan dort tipten biri olabilir.
Genel olarak kullanımı
*get: birşeyler getirmek istediğimiz zaman kullanırız
*post: birşeyler gondermek kaydetmek için kullanırız
*put: birşeyler güncellemek düzeltmek için kullanırız
*delete: birşeyler silmek istediğimizde kullanırız.

Form etiketleri uzerinden giden istek ile browserdan url olarak giden istek arasındaki fark nedir?
Eğer ki istek bizim form taglerimiz içerisinde gidiyorsa onunla birlikte butun input degerleride işlem için birlikte gider buda her iki isteği birbirinden ayırt eder.(input type=text, type=radio, type=checkbox) ve dropdownlistin select select ogesi gonderilebilir.

“input type=submit” ve “input type=button” arasındaki farklar?
Submit buton bizim serverdan ozel olan isteklerimiz anlamına gelir. Normal buton ise bizim client tarafındaki ozel bazı olayları yonetebilmemiz için kullanılır. Normal buton sade kullanıldığı zaman serverdan herhangi bir istekte bulunamaz.

4.Server side/controller ile get/post işlemi
4.1.Şimdi çalışanController içerisine aşağıdaki gibi birtane action method yazıyoruz 
public string KaydetCalisan(Calisanlar c)
{
return c.Ad + "--" + c.Soyad + "--" + c.Maas;
}
4.2.daha sonra
http://localhost:25654/Calisan/index sayfamızdan verdigimiz link ile
http://localhost:25654/Calisan/YeniKayit sayfamıza gidiyoruz ve burda yeni kaydımızı olusturuyoruz
Not: formu olusturuken  
  yazdığımız action ismi ile yukarıda olusturdugumuz action ismi aynı olmali.
ve daha sonra kaydet butonuna basmalıyız.
ahmet--saglam--234
diye bir sayfa sonuç olarak dönmeli.
5. Reset ve Iptal butonları
5.1 Html içeriğini duzenliyoruz(ekle calisan).
script
function ResetForm() {
document.getElementById('TxtAd').value = "";
document.getElementById('TxtSoyad').value = "";
document.getElementById('TxtMaas').value = "";
}
script 

form action="/Calisan/KaydetCalisan" method="post"
Ad : input type="text" id="TxtAd" name="Ad" value=""  br 
Soyad : input type="text" id="TxtSoyad" name="Soyad" value=""  br 
Maas : input type="text" id="TxtMaas" name="Maas" value=""  br
input type="submit" name="BtnGonder" value="Çalışan Kaydet
input type="button" name="BtnReset" value="Reset" onclick="ResetForm();"
input type="submit" name="BtnGonder" value="İptal
form

Yukarıda fark ettiğiniz üzere butonlarımızı üçledik ve reset butonumuzun onclick eventine bir script yazdık boylece tıklandıgında bizim textboxlarımızın içerisi temizlenecek.
Aynı zamanda kaydet ve iptal butonlarının isimlerini BtnGonder olarak ayarladık ve bu kaydetCalisan methodumuza gittiginde oradaki kotnroller ile ya kayıt eklenecek yada ana sayfaya yonlendirme yapılacak.

5.2 KaydetCalisan Methodumuzu duzenliyoruz.
public ActionResult KaydetCalisan(Calisanlar c,string btnGonder)
{
switch (btnGonder)
{
case "Çalışan Kaydet":
return Content(c.Ad+ "--" + c.Soyad + "--" + c.Maas);
case "İptal":
return RedirectToAction("Index");
}
return new EmptyResult();
}
Ve şimdi F5 ile yaptığımız değişiklikleri inceleyebiliriz.

6. Veritabanına kayıt ve aynı zamanda listeyi yenileme
6.1 Dal klasörümüz içerisindeki CanliSatısDal sınıfına ikinci bir method ekliyoruz KaydetCalisan
public class CanliSatisBal
{
public List GetCalisanlar()
{
CanliSatisDal canliSatisDal = new CanliSatisDal();

return canliSatisDal.Calisanlar.ToList();
}
public Calisanlar KaydetCalisan(Calisanlar c)
{
CanliSatisDal canliSatisDal = new CanliSatisDal();
canliSatisDal.Calisanlar.Add(c);
canliSatisDal.SaveChanges();
return c;
}
}
6.2 Controller içerisindeki KaydetCalisan methodunu degistiriyoruz.
public ActionResult KaydetCalisan(Calisanlar c,string btnGonder)
{
switch (btnGonder)
{
case "Çalışan Kaydet":
CanliSatisBal canliSatisBal = new CanliSatisBal();
c.BaslamaTarihi = DateTime.Now;
canliSatisBal.KaydetCalisan(c);
//çalışanı kaydediyoruz ve index sayfasına yonlendiriyoruz
return RedirectToAction("Index");
case "İptal":
return RedirectToAction("Index");
}
return new EmptyResult();
}
F5 ile yaptığımız değişiklikleri inceleyebilirsiniz. Yeni kayıt işlemi veri tabanına yapılmıs ve aynı zamanda index sayfamızdaki listede gösterilmiştir.

27 Aralık 2015 Pazar

MVC EntityFramework Bağlantısı, Bal-Dal Katmanları Ve Verilerin Listelenmesi

MVC projemizde Veritabanı ile çalışmak

Bu yazımızda veritabanı işlemlerini DAL katmanını ve alınan dataların listelenmesi işlemlerini anlatacağım daha onceki MVC yazımızın devamı netiliğinde olacaktır.
Veri tabanı ile haberleşme işlemini yaptığımız kod bloğunun bulunduğu katmana Data access Layer(dal) denir. Veritabanı ile haberleşmede EntityFramework kullanacağız. Peki entityFramework nedir dersek? Entityframework microsoftun ORM(object relational mapping) aracıdır.
Entityframework ile bizler aşağıdaki üç yaklaşımdan birini kullanırız
1. DatabaseFirst : Veritabanının hazır oluşturulduğu colonların tabloların ilişkilerin hazır olarak alınıp entityframeworkte kullanıldığı durumdur.(sadece verilen veritabanına uygun yapıyı üretiriz)
2. ModelFirst : Model sınıfının ve ilişkilerin visual studiodan oluşturulduğu entityframeworkun bize DAL  ve veritabanını (colon ve ilişkilerle birlikte) ürettiği yaklaşımdır.
3. CodeFirst : Herşeyin onceden code ile tasarlanıp yazıldığı yaklaşımdır. Uygulama ilk kez çalıştığında entityframework bizlere DAL ı aynı zamanda veritabanını colon ve ilişkiler ile birlikte ürettiği yaklaşımdır. 
Daha önceki çalışmalarımızı veritabanından bağmsız kendi oluşturduğumuz sınıflar ile yapmıştık bundan sonraki çalışmalarımızda veritabanını ve daha çok codefirst yapısını kullanarak ilerliyor olacağız bunun için işlemlerimize öncelikle yeni bir veritabanı oluşturarak başlamak istiyorum.
Bilgisayarımızda kurulu olan sql servera bağlanıp yeni bir veritabanı oluşturuyoruz.

Veritabanı oluşturma ve liste halinde gosterme
1.Sqlserver da database kısmına sağ tıklayıp CanliSatis Adında yeni bir veritabanı oluşturun.
2.Visual Studiomuzda projemizi açıp connectionString oluşturmak için Web.Config dosyasını açalım ve Configuration bolumunun içerisine
connectionStrings
add connectionString="Data Source=SAHIN;Initial Catalog=CanliSatis;Integrated Security =True"
name="CanliSatisDal"
providerName="System.Data.SqlClient"
connectionStrings
ifadesini ekliyoruz.
3.Projemize Entityframework u referans olarak ekliyoruz
Projemizin üzerine sağ tıklayıp->Manage Nuget packages diyoruz ve online kısmından entity framework aratıyoruz. Daha sonra install deyip projemize ekliyoruz.
4.Projemizin üzerine sağ tıkayip yeni klasor ekle diyoruz ve daha sonra bu klasorun icerisine CanliSatisDal diye bir class oluşturuyoruz.
Oluşturduğumuz sınıfın üstkısmında using olarak :using System.Data.Entity; referansını ekliyoruz daha sonra dbContext sınıfından miras alıyoruz.
public class CanliSatisDal:DbContext
{
}

5.Calisanlar sınıfımıza birincil anahtar ekleme islemini yapıyoruz. oncelikle using olarak
System.ComponentModel.DataAnnotations; ekliyoruz.Sonra key anahtarini gosteriyoruz
public class Calisanlar
{
[Key]
public string Ad { get; set; }
public string Soyad { get; set; }
public int Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
}

6. Simdi veritabani için maping işlemlerine başlıyoruz CanliSatisDal sinifimiza gidip OnModelCreating methodunu ezmemiz gerekiyor(override ediyoruz) using olarak proje adimizi ve model klasorumuzu ekliyoruz
using MVCSevenDayStart.Models;
public class CanliSatisDal:DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("tblCalisanlar");
base.OnModelCreating(modelBuilder);
}
}
(Run time) çalışma zamanında otomatik olarak tblCalisanlar tablomuzu oluşturacaktır.
7.Database clasımızı uygulamamızda tutmak için CanliSatisDal sinifimiza birde çalışanları dbSet olarak ekliyoruz
public class CanliSatisDal:DbContext
{
public DbSet Calisanlar { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("tblCalisanlar");
base.OnModelCreating(modelBuilder);
}
}

8.Simdi bir klasor daha ekliyoruz ismine Bal diyoruz ve içerisinde CanliSatisBal adinda bir klasor ekliyoruz. Daha once olusturdugumuz BusinessLayer(iş katmanı) içerisindeki kodu, verilerimiz databaseten gelecek şekilde değiştiriyoruz ve bu yeni sinifimiza ekliyoruz.(Bu işlemden sonra Model içerisindeki CalisanBusinesslayer sınıfını silebiliriz)
Tabiki ilk işlem olarak using sınıfını ekliyoruz. Bal sinifimiz aşagidadir
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using MVCSevenDayStart.Dal;
using MVCSevenDayStart.Models;
namespace MVCSevenDayStart.Bal
{
public class CanliSatisBal
{
public List GetCalisanlar()
{
CanliSatisDal canliSatisDal = new CanliSatisDal();

return canliSatisDal.Calisanlar.ToList();
}}}

Daha sonra bir hata alirsanız eger CalisanListController içerisine using olarak Bal klasorumuzu( using MVCSevenDayStart.Bal;) de eklemeyi unutmuyoruz.

CalisanlarListViewimizin son guncel hali
@using MVCSevenDayStart.Models
@model CalisanListViewModel
..
..
body div
Merhaba @Model.KullaniciAdi
div
div table tr
thCalisan Adi th
thMaasi th
tr
@foreach (CalisanViewModel item in Model.CalisanlarList)
{
tr
td@item.Ad td
td style="background-color:@item.CalisanRenk">@item.Maas td
tr
}
table div body
Eger derleme sonrasında sadece "Merhaba admin çalışan adi maasi"  yazan bir sayfa karşımıza geldi ise dogru adimları yapmışız :)

9.Simdi sqlserver tarafında veritabanımızı kontrol ediyoruz bakalım istedigimiz tblCalisanlar Sınıfımız oluştumu.

Evet adımları tektek yapı iseniz ve hata almadan çalıştırabildiyseniz sizinde tblCalisanlar sınıfınız oluşmustur ve simdi el ile birkac kayıt ekleyip tekrardan projemizi derleyelim. Eklediğimiz kayıtların listelendiğini görebiliriz.
Not:Hata almayan ve veritabanı oluşmayan arkadaşlar  içerisini tekrardan kontrol etmelerini oneririm burdaki yazım hataları bizim veritabanımızın oluşmasına engel olabilir.

Peki ya kullandığımız DbSet neyi ifade eder?
     Bizim veritabanından sorgu ile çektiğimiz tüm dataların tutulduğu, veritabanındaki tabloların temsil edildiği bir sınıfı ifade eder.Linq sorgusu yazdığımızda biz bu dbset nesnesini kullanırız oda veritabanındaki tablolara ceviri yaparak istedigimiz kolleksiyonları bizlere döndürür.
  
ConnectionString ve Dal arasındaki bağlantı nasıl olur?
Mapping işlemi connectionstring ifadesindeki name üzerinden yapılır. ConnectionStringName ve DalClass name aynı olduğu için otomatik olarak mapping "CanliSatisDal" gerçekleşir.

Simdi projemizde bazı değişiklikler yaparak katmanlı yapıyı daha anlamlı bir hale getirelim
İlk MVC Baslangic yazımızda anlattığımız bazı sınıfların isimlerini değistirelim ve daha anlamlı bir yapı oluşturalım.
* CalışanConroller olarak yeni bir controller olusturuyoruz ve icerisine index ile birlikte getcalisanlist action methodunu olusturuyoruz(CalisanListController icerisinden alabiliriz).
*Methodlara sağ tıklayıp add view diyoruz ve calisanview olusuyor icerisinde de iki methoda ait classlarımız olusuyor.
*GetCalisanDetay action methodumuzu yorum satirina alıyoruz Index methodumuzu yorum satırında ise yorum satırından çıkarıyoruz
*CalisanlarListViewModel içerisindeki calisanadi ozelliğini kaldırıyoruz. Ve Viewin içerisinde kullanılan alnıda kaldırıyoruz.
Son olarak SolutionExplorer goruntumuz aşağıdaki gibi oluyor


CalısanController.cs içerigi
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using MVCSevenDayStart.Models;
using MVCSevenDayStart.Bal;
namespace MVCSevenDayStart.Controllers
{
public class CalisanController : Controller
{

public ActionResult Index()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CanliSatisBal cnlsatisBal = new CanliSatisBal();
List calisanlarList = cnlsatisBal.GetCalisanlar();

List calisanViewModels = new List();

foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel calisanViewModel = new CalisanViewModel();
calisanViewModel.Ad = item.Ad;
calisanViewModel.Soyad = item.Soyad;
calisanViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
calisanViewModel.CalisanRenk = "yellow";
}
else
{
calisanViewModel.CalisanRenk = "green";
}
calisanViewModels.Add(calisanViewModel);
}
calisanListViewModel.CalisanlarList = calisanViewModels;


return View("Index", calisanListViewModel);//-->View ismini degistiriyoruz
}

public ActionResult GetCalisanListesi()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CanliSatisBal cnlsatisBal = new CanliSatisBal();
List calisanlarList = cnlsatisBal.GetCalisanlar();

List calisanViewModels = new List();

foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel calisanViewModel = new CalisanViewModel();
calisanViewModel.Ad = item.Ad ;
calisanViewModel.Soyad = item.Soyad;
calisanViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
calisanViewModel.CalisanRenk = "yellow";
}
else
{
calisanViewModel.CalisanRenk = "green";
}
calisanViewModels.Add(calisanViewModel);
}
calisanListViewModel.CalisanlarList = calisanViewModels;

return View("GetCalisanListesi", calisanListViewModel);
}

public string YaziYaz()
{
return "Merhaba Dunya’lı";
}
//müsteri donduren bir action method
//public Musteri getMusteri()
//{
// Musteri m = new Musteri();
// m.adi = "sahin";
// m.soyadı = "yaral";
// return m;
//}

//bir method içerisinde birden cok view çağırılabilir.
public ActionResult ilkView()
{
Random r = new Random();
int sayi= r.Next(0, 10);
if (sayi<5 br="">{
return Content(YaziYaz());
}
else
{
return View("Index");
}
}

//public ActionResult getCalisanDetay()
//{
// Calisanlar c = new Calisanlar();
// c.Ad = "safak";
// c.Soyad = "yaral";
// c.Maas = 1234;
// c.BaslamaTarihi = DateTime.Now;

// //viewdatamızı oluşturup çalısanımızı viewimize gonderiyoruz
// //ViewData["Calisan"] = c;
// //return View("Calisan");

// //viewdata yerine viewbag kullanımı
// //ViewBag.Calisanlar = c;
// //return View("Calisan");

// //genel olarak calisanlar sınıfını gondermek
// return View("Calisan", c);
//}
}
}
GetCalisanListesi.cshtml icerigi
Index.cshtml icerigi

F5  .../Calisan/Index sayfasına gittigimizde çalışanlarımızın listelendiğini gorebiliriz ayni zamanda .../Calisan/GetCalisanListesi ile de ayni listeyi elde edebiliriz.
Bu yazımızda database bağlantımızı ve kayıtları listeleme işlemini ele aldık bir sonraki yazımızda kayıt ekleme silme ve guncelleme işlemlerini ele alacağız
Kaynak :http://www.codeproject.com/Articles/986730/Learn-MVC-Project-in-days-Day

14 Aralık 2015 Pazartesi

MVC (model-view-controller) yeni başlayanlar için

     Bu yazımızda asp.net webform üzerinde biraz geliştirme yapmış ve daha önce asp.net MVC konusunu duymus fakat baslayamamıs olan arkadaşlarımıza giriş düzeyinde bir anlatım olacaktır.
     Bu işe yeni başlayan MVCyi yeni öğrenecek arkadaşlarımızın çoğunluğunun aklına ilk gelen asp.net MVC nin asp.net webformun gelişmiş hali veya yeni bir versiyonu olduğudur. Fakat bu kesinlikle yanlış bir düşüncedir. Fakat web form ile web uygulamaları yapılırken MVC bir mimari yaklaşımdır, bizim kodlarımızın daha doğru ve daha temiz olması mimari açıdan uygulamalarımızın daha hızlı daha güvenli çalışmasını sağlamaktadır.
     Microsoft Asp.net Webform dan sonra MVC mimarisi uzerinde Asp.net MVC geliştirdi. Bu gelişimi yaparken bizlere webformun ayrı MVCnin ayri tutulacağını ve birbirinin yerini almayacağını duyurmuştu. Bu nedenle ki günümüzde web uygulamaları hem webform ile yapılmakta hem de MVC ile yapılmaktadır. Tabi ki gelecekte web uygulamaların MVC üzerine inşaa edileceği öngörülüyor benim düşüncem de bu öngörünün doğru ve mantıklı olduğudur.
    Peki ya ASP.net Web Formu 12 yıldır populer kılan neden nedir?
    Bunun asıl nedenlerinden biri Microsoftun sahip olduğu vede tüm platformlarda kullandığı ide si VisualStudio. .Net yazılımcıları ilk yıllarından buya bu ide üzerinde uygulamalarını geliştirmiştir. Bunun yanında VB.net ten buyana süre gelen bir yazım alışkanlıkları vardır "Code Behind". Yazılımcılar kendi uygulamalarını UI tarafında sürükle bırak yöntemine alışmış ve daha sonra mantık ve veritabanı işlerini çift tık ile UI arkasına geçerek burada tamamlamışlardır. Bu nedenle web formlarda bir aspx ve birde aspx.cs uzantılı dosyalar mevcuttur. Bu şekilde kodlama bir süre sonrasında alışkanlık haline gelmiştir. Bu alışkanlıklardan günümüzde vazgeçmek hiçte kolay değildir.
    Her şey iyi güzel iken Web Formun sahip olduğu eksiklikler nelerdi?
    Web Formun en önemli iki eksikliğe de sahipti. Bunlar:
-Cevap süresi: yani serverın kullanıcının isteğine verdiği cevabın süresi
-Bant genişliği: Servera nekadar datanın gönderildiğidir.(Viewstate'tin fazla data taşıması sistemi ağırlastırmaktadır.)
MVC Contorller
1.  Yeni bir .net MVC projesi(empty) oluşturalım.
2.  Solution explorer dan controler klasorunun uzerine sağ tıklayım yeni controler ekleyelim
3. "MVC 5 Controller – Empty" seçip change authentication kısmından No authentication seciyoruz ve tamam diyoruz. MVC projemiz oluşuyor.
4.  Sıra yeni Controller eklemeye geldi. Controllers sekmesine sağtıklayıp add new Controller diyoruz ve MVC 5 Controller Empty seçiyoruz. Ismine TestController deyip tamam diyoruz.
5. Controller içerisine alttaki actionı ekliyoruz. 
public string YaziYaz()
{
return "Hello World is old now. It’s time for wassup bro ;)";
}
Run dedikten sonra Tarayıcımızda “ControllerName/ActionName” olarak çağırıyoruz. localhost:25654/Test/YaziYaz ve çıktısını goruyoruz :) 

Not: Buraya kadar sizlere .net webform ve asp.net MVC arasındaki ilişkiyi web formların eksik kısımlarını ve yeni bir MVC projesi oluşturup Merhaba Dunya yazmayi gosterdim. 

 TestControler ve Test ilişkisi
TestControler bizim classımızın ismidir Test ise bizim controllerımızın ismidir. Yani biz url de controller ismini yazmank istediğimizde sadece ../Test dememiz yeterli olacaktır.

Action method nedir
Bunlar controler içerisinde bulunan public methodlarımızdır. Kullanıcının istekte bulundugu ve bu isteğe karşı verilen yanıtları içerir.
Yukarıdaki örneğimizde YaziYaz() action methodumuz bizim string değer döndürür.
Web Form projelerinde geri dönüş tipleri html olurdu fakat .net MVC ile biz istediğimiz tipte bir geri dönüş değeri elde ederiz.

public class TestController : Controller
{
public string YaziYaz()
{
return "Hello World is old now. It’s time for wassup bro ;)";
}
//müsteri donduren bir action method
public Musteri getMusteri()
{
Musteri m = new Musteri();
m.adi = "sahin";
m.soyadı = "yaral";
return m;
}
}
public class Musteri
{
public string adi { get; set; }
public string soyadı { get; set; }
}
}
TestController icersine aşağıdaki kodları yazdıktan sonra tarayıcımızda projemizin (NameSpace.ClassName) uzantısını goruruz. Nedeni ise ToString() methodunu ezmemiş olmamızdır.

public class Musteri
{
public string adi { get; set; }
public string soyadı { get; set; }
public override string ToString()
{
return this.adi + "***"+ this.soyadı;
}
}
Yukarıdaki seklinde duzenleyip tekrar F5 yapıyoruz ve action methodtan istedigimiz donuş tipini elde ediyoruz. 
MVC View
Mimari olarak UI katmanıda denir. Kullanıcılara sunulan ara yüzü içermektedir.
1. TestController içerisinde GetView() adinda birtane ActionResult method oluşturalım.
2. Daha sonra bu GetView() uzerinde sağ tıklayarak AddView diyoruz.
3. UseLayoutpage secimini kaldırıyoruz ismini MusteriView olarak koyuyoruz ve add butonuna tıklıyoruz

Views->Test->MusteriView.cshtml olarak oluşturduğumuz viewi görebiliriz.
Not: F5 ile çalıştırma da dikkat edilmesi gereken iki nokta var
Eğerki view üzerinde debug ediyor iseniz controller tarafinda view adında ait bir methodunuz yok ise hata alırsınız!
Controler üzerinde debug ederseniz home klasörüne gider ve buradan siz kendiniz urli yazıp ulaşmalısınız.
Oluşturduğumuz bir method içerisinde durumu kontrol ederek istediğimiz view'i çağırabiliriz.
Aynı Sekilde bir view birden cok method tarafından çağırılabilir.

//bir methodiçerisinde birden cok view çağırılabilir.
public ActionResult ilkView()
{
Random r = new Random();
int sayi=r.Next(0, 10);
if (sayi<5 br="" clear="none">{
return View("YaziYaz");
}
else
{
return View("MusteriView");
}
}
ActionResult ve ViewResult Arasındaki bağlantı
ViewResult actionResult tın iki alt sınıfıdır. Nasıl iki alt sınıfı derseniz eğer: 
ViewResult ViewResultBase'in alt sınıfıdır. ViewResultBase ise actionResult'ın alt sınıfıdır. Burada polymorphism devreye giriyor. Aşağıdaki örneği inceleyelim
 public ActionResult ilkView()
        {
            Random r = new Random();
            int sayi=  r.Next(0, 10);
            if (sayi<5 br="" clear="none">            {
                return Content(YaziYaz());
            }
            else
            {
            return View("MusteriView");
            }
        }
Bu ornekte ActionResult kullandık çünkü ilk durum ViewResult döner iken ikinci durum ContentResult donuyor. ContentResult ta ActionResult'ın alt sınıfıdır. Bizde Polymorphism nimetlerinden faydalanıyoruz.

ViewResult ve ContentResult
ViewResult bizlere yanıt olarak tum htmli döndürmektedir fakat ContentResult ise bize dönüş değeri olarak sadece string degerler doner fakat ikiside actionResult sınıfındandir.

Not: ActionName ile ViewName eşit ise return view içerisine olusturdugumuz view in ismini yazmamıza gerek yoktur.
Routing
Bizim URLimizde yer alan değerlerin anlamsız rakam ve yazılar barındırmasını engeller. Yani sadece klasor goruntusunu verir ve son olarak bulundugumuz sayfanın ismini verir.
RouteConfig
Bizim routemap ayarlarımızın yapıldığı config dosyasıdır. Url haritamızın default değerleri ve routemap yapımızı belirleriz.Birden fazla maproute olusturabiliriz fakat name alanları birbirinden farklı olmalıdır.

MVC Model
Model bizim verilerimizin tutuldu sınıflardır. Örnek üzerinden inceleyelim
1. Model klasörüne sağ tıklayım add->new class diyoruz ve ilk model sınıfımızı oluşturuyoruz. İsmine Calısanlar diyoruz.
2. İçerisine adı soyadı maas ve baslama tarihi parametrelerini ekliyoruz.
public class Calisanlar
{
public string Ad { get; set; }
public string Soyad { get; set; }
public int Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
}
3. Controllerdan model sınıfımıza erisiyoruz. Erişebilmek için öncelikle using olarak model sınıfımızı eklemeyi unutmuyoruz. 
ViewData Bizim controller ve viewler arasında veri aktarımımızı sağlar.  asp.net ve mvc3 e kadar kullanılmıstır mvc3 ten sonra yerini dinamik yapıya sahip olan ViewBag almıştır.

public ActionResult getCalisanDetay()
{
Calisanlar c = new Calisanlar();
c.Ad = "safak";
c.Soyad = "yaral";
c.Maas = 1234;
c.BaslamaTarihi = DateTime.Now;

//viewdatamızı oluşturup çalısanımızı viewimize gonderiyoruz
ViewData["Calisan"] = c;
return View("Calisan");
}
4. Yeni bir view olusturmak icin getCalisanDetya() uzerine sağ tıklayip addview diyoruz ve ismine Calisan diyoruz.
5. ViewCalisanların içerisini aşağıdaki gibi düzenliyoruz ve f5 ile çalıştırıyoruz. 

Not: Tarayıcıda .../Calisan diye aratırsanız hata alırsınız çünkü controller icerisindeki action ismi ile view ismi farklıdır. Burada action ismini yazmamız gerekmekteri yani .../getCalisanDetay dediğimizde bu methodumuz bizi calısanlar viewine yonlendiricektir.
@{
Projeadi.Modelklasorunadi.Modelsınıfınızınadi cls = (Projeadi.Modelklasorunadi.Modelsınıfınızınadi)
ViewData["Calisan"];
}


Çalışan adı : @cls.Ad

Çalışan soyadı : @cls.Soyad

Çalışan maaş :@cls.Maas.ToString("C")

Çalışan giriş tarihi :@cls.BaslamaTarihi

Çalışan adı-soyadı :@(cls.Ad+” “+cls.Soyad)

ViewBag
C# 4.0 dan sonra geliştirilmistir. MVC3ten sonra viewdata nin yerini almıs ve viewdata nın dinamik hali olarak kullanılmaktadır. Yukarı ki örneğimizde değiştirmemiz gereken alanlar sunlardır:
Controller icerisinde yorumsatirina aldığımız kısım
//viewdatamızı oluşturup çalısanımızı viewimize gonderiyoruz
//ViewData["Calisan"] = c;
//return View("Calisan");
//viewdata yerine viewbag kullanımı
ViewBag.Calisanlar = c;
return View("Calisan");
View içerisinde yorum satırına aldığımız kısım
@*@{
MVCSevenDayStart.Models.Calisanlar cls = (MVCSevenDayStart.Models.Calisanlar)
ViewData["Calisan"];
}*@
@{
MVCSevenDayStart.Models.Calisanlar cls = (MVCSevenDayStart.Models.Calisanlar)
ViewBag.Calisanlar;
}
veya view icerisinde 
@{
@Model;
}

Çalışan adı : @Model.Ad

Çalışan soyadı : @Model.Soyad

Çalışan maaş :@Model.Maas.ToString("C")

Çalışan giriş tarihi :@Model.BaslamaTarihi
gibi bir değişiklik yaparsak çalışan detaylarına ulaşabiliriz. Daha fazla ornek için

View içerisine liste göndermek
1. Bunun için öncelikle yeni bir model oluşturalım ve adina CalisanviewModel diyelim.
public class CalisanViewModel
{
public string Ad { get; set; }
public string Soyad { get; set; }
public string Maas { get; set; }
public DateTime BaslamaTarihi { get; set; }
public string CalisanRenk { get; set; }
}
2. Daha sonra list model oluşturalim ve adına CalisanListViewModel diyelim.
public class CalisanListViewModel
{
public List CalisanlarList { get; set; }
public string KullaniciAdi { get; set; }
}

3. Yeni bir view oluşturalim ve adına CalisanlarListesi diyelim. Ve içerisini aşağıdaki gibi düzenleyelim.
@foreach (CalisanViewModel item in Model.CalisanlarList)
{

@item.Ad

@item.Maas

}
4. Simdi sıra projemizi bir basamak ilerletmeye geldi ve business layer katmanını olusturuyoruz. Bunun için model klasorunun içerisine CalisanlarBusinessLayer adinda bir sinif olusturuyoruz. Ve içerisine GetCalisanlar methodunu ekliyoruz.
public List GetCalisanlar()
{
List calisanList = new List();
for (int i = 0; i < 5;i++ )
{
Calisanlar cls = new Calisanlar();
cls.Ad = "sahin" +i;
cls.Soyad = " yaral"+i;
cls.Maas = 1234 +i*100;
calisanList.Add(cls);
}
return calisanList;
}

5. Sıra verilerimizi view icerisine gostermeye  geldi bunun için yeni bir controller oluşturuyoruz tabi isteyenler testController içerisindede yapabilirdi.Ve olusturdugumuz controller içerigini aşagıdaki gibi düzenliyoruz.
public ActionResult CalisanListesi()
{
CalisanListViewModel calisanListViewModel = new CalisanListViewModel();

CaslisanlarBusinessLayer clsBal = new CaslisanlarBusinessLayer();
List calisanlarList = clsBal.GetCalisanlar();
List clsViewModels = new List();
foreach (Calisanlar item in calisanlarList)
{
CalisanViewModel clsViewModel = new CalisanViewModel();
clsViewModel.Ad = item.Ad + " " + item.Soyad;
clsViewModel.Maas = item.Maas.ToString();
if (item.Maas > 1235)
{
clsViewModel.CalisanRenk = "yellow";
}
else
{
clsViewModel.CalisanRenk = "green";
}
clsViewModels.Add(clsViewModel);
}
calisanListViewModel.CalisanlarList = clsViewModels;
calisanListViewModel.KullaniciAdi = "Admin";
return View("CalisanlarListesi", calisanListViewModel);
}

simdi F5 deyip sonucu kontrol edebiliriz bende .../CalisanList/CalisanListesi altında gorunmektedir.

MVCde başlagıç seviyesinde bir girisimiz oldu.Sanırım birazda uzunca oldu :) Kaynaklar: