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.