Sayfalar

5 Haziran 2013 Çarşamba

ASP.NET MVC DERSLERİ ( 6.8 ) DATAANNOTATIONS PERDE ARKASI

Kendi dataannotations nesnelerimizi yazmak için, bu işin perde arkasını anlamak gerekiyor. Tüm bu validation işlemleri, model binders, model metadata, model validators, ve model state kavramları ile ilişkilidir. Şimdi sırasıyla başlıklar halinde bunlara değinelim.

Validation ve Model Binding

Dataannotations konusunu işlerken, şöyle bir soru gelmiş olabilir aklınıza: Validation işlemleri ne zaman oluşur? Eğer validation işlemi başarısız olursa bunu nasıl anlarız?

Validation işlemi model binding sırasında çalışır. Örneğin;
[HttpPost]
public ActionResult HaberEkle(Haber haber)
{
    // haber model binder tarafından burada oluşturulur 
    // ve burada artık validation işlemi yapılmıştır.
    // ..
}

Bu model binding sırasında MVC bir validator(DataAnnotationsModelValidator) çalıştırarak tüm model hatalarını yakalar.

Validation ve Model State

Model binding işleminden ilk etkilenen ModelState nesnesidir. ModelState nesnesi, model içerisindeki tüm özelliklerin bilgilerini tutar. Bu özelliklerden bir tanesinin bile hata varsa ModelState.IsValid deyimi false değer döndürecektir.

Örneğin kategori eklerken kategori adını girmeden (Required), sayfayı post edersek aşağıdaki tüm satırlar true dönecektir.
ModelState.IsValid == false
ModelState.IsValidField("KategoriAdi") == false
ModelState["KategoriAdi"].Errors.Count > 0

ModelState içerisine bakarak hangi özelliğin hata verdiğini anlayabiliriz. Örneğin;
var kategoriErrorMessage = ModelState["KategoriAdi"].Errors[0].ErrorMessage;

Kod yazarak daha detaylı hata mesajlarıda alınabilir.

Controller Actions ve Validation Errors

Controller metodları, model validation hata verdiğinde ve ya başarılı olduğunda ne yapması gerektiğine karar verebilir. Eğer model state hata verirse bunu metod içerisinde yakalayıp modeli tekrar ilkleyip view içerisine göndeririz. View içerisindeki validation helper, model state içerisindeki bu hatayı yakalar ve hata mesajı verir.
@Html.ValidationMessageFor(m => m.KategoriAdi)

Controller metod içerisindeki bu hatayı yakalamanın çok farklı yolları vardır. Biz örnek proje içerisinde try-catch bloğu içerisinde yakaladık. Ama  if(ModelState.IsValid), TryUpdateModel gibi farklı yollarla da yakalayabilirsiniz.

Hiç yorum yok:

Yorum Gönder