Sayfalar

21 Mayıs 2013 Salı

ASP.NET MVC DERSLERİ ( 6.2 ) DATAANNOTATIONS Required

Daha önceki yazılarda EditorForModel helper elemanını görmüştük. Bu helper elemanını kullanınca, model üzerindeki özelliklere göre input elemanları oluşturuluyordu. Yani int tipi için bir textbox, bool tipi için bir checkbox, ... gibi.Bunlar MVC kendisi içerisindeki varsayılan şablonları (templated-helpers) kullanarak yapar.

EditorForModel kullanınca, tüm özellikler için html inputları oluşturulur. Ama mesela biz, ID değeri için input elemanı istemeyebiliriz. Çünkü bu değeri otomatik veritabanı verir. Kısacası, tüm bu anlattıklarımı düzenlemek için de dataannotationlardan yararlanabiliriz. İlk olarak Required niteliğini görelim;

Required

Bu nitelik ile modeldeki herhangi bir özelliğin kullanıcı tarafından girilmesinin zorunlu olduğunu belirleriz. Örneğin kategori sınıfı için:
[Required(ErrorMessage = "{0} alanı gereklidir.")]
public string Ad { get; set; }

şeklinde bir tanımlama yaparsak, view sayfası içerisinde Ad için oluşturduğumuz input elemanına bir değer girmeden göndermeye çalıştığımızda aşağıdaki sonuç çıkacaktır.

Normalde eğer ErrorMessage değişkenini yazmamış olsak, yani sadece [Required] şeklinde yazsaydık, hata mesajı şu olacaktı: "The Ad field is required." Bu arada sadece null değer değil, boş değer girildiğinde de aynı hata mesajı alınacaktır.

Burada önemli bir nokta vardır. MVC mimarisinin hem istemci taraflı, hem de sunucu taraflı olarak hataları yakalamayı sağlayacak bir tasarımı vardır. Yani eğer, kullanıcının tarayıcısında javascript açık değilse ya da gerekli validation javascript kütüphanesi eklenmemişse, bu doğrulama işlemi sunucu taraflı olacaktır.

Doğrulama işlemlerinin perde arkasını ileride görmeye calışacağız. İstemci taraflı karşılaştırma nasıl oluyor, mantığı nedir? Doğrulama mimarisi nasıl işler? gibi başlıkları açıklamaya çalışacağız.

17 yorum:

  1. Merhaba Ali bey,
    deslerinizi sırasıyla takip ediyorum elinize sağlık çok güzel anlatımlar var. Dataannotations kullanımında formu oluşturduğum modeldeki kontrolün içi boş submit ettiğimde sayfa post oluyor sizin belirttiğiniz gibi uyarı veya kontrol yapmıyor sizce sebebi neler olabilir

    YanıtlaSil
  2. Merhaba Ali bey,
    deslerinizi sırasıyla takip ediyorum elinize sağlık çok güzel anlatımlar var. Dataannotations kullanımında formu oluşturduğum modeldeki kontrolün içi boş submit ettiğimde sayfa post oluyor sizin belirttiğiniz gibi uyarı veya kontrol yapmıyor sizce sebebi neler olabilir

    YanıtlaSil
    Yanıtlar
    1. Kodları paylaşırsanız daha net cevap verebilirim. Sayfada, Validation ile alakalı scriptleriniz ekli mi?

      Sil
    2. Tabi birde controller tarafında if(ModelState.IsValid) kontrolu lması gerekiyor.

      Sil
    3. Selam,
      --Test isimli bir sınıfım var ve içeriği
      [Required(ErrorMessage = "{0} alanı gereklidir.")]
      [StringLength(50, ErrorMessage = "En fazla {1} karakter uzunluğunda olmalıdır.", MinimumLength = 3)]
      [DataType(DataType.Text)]
      [Display(Name = "Ad Soyad")]
      public string Ad { get; set; }

      --bu modeli homeController içindeki index ActionResult'tan aşağıdaki şekilde viewe gönderiyorum

      public ActionResult Index()
      {

      Test test = new Test();

      return View(test);
      }
      --index viewinde içriği aşağıdaki gibi.
      @model Dataannotations.Models.Test
      @{
      ViewBag.Title = "Home Page";
      }

      /Scripts/jquery.unobtrusive-ajax.min.js
      /Scripts/jquery.validate.min.js
      /Scripts/jquery.validate.unobtrusive.min.js

      @using ((Html.BeginForm("Index", "Home", FormMethod.Post)))
      {
      @Html.ValidationMessageFor(x => Model.Ad)
      @Html.TextBoxFor(x=> Model.Ad)


      input type="submit" value="Gönder"
      }

      Sil
    4. Buaraya kadar sorun yok gibi. Post ettiginiz metodu da gorebilir miyim?

      Sil
    5. Formun post metodu mu?

      Sil
    6. Evet. Yani [HttpPost]public ActionResult Index(Test model){...} diye başlayan metod.

      Sil
  3. böyle bir satır yazmadım sadece Viewin içerisindeki formda "FormMethod.Post" kodu var. nasıl bir yapıdan bahsediyorsunuz acaba ?

    YanıtlaSil
    Yanıtlar
    1. http://alirizaadiyahsi.blogspot.com/2013/03/aspnet-mvc-dersleri-42-model-guncelleme.html

      Modelleri post ettiginiz bir metod daha olmalı. Ekleme ve Düzenleme işlemlerinde, yani form post işlemlerinde, postaladığınız, veriyi yakalayacak ikinci bir metod daha olmalı. Yani sizin örneğinize göre, bir index metodu daha olmalı ve bunun basında da [HttpPost] olmalı. Bu metoda modelinizi parametre olarak aktarmalısınız.

      Sil
    2. Şimdi konuyu araştırdım evet formun post olacağı kontrolü ve metodu belirttim şimdilik sadece index viewini döndürüyor.

      [HttpPost]
      public ActionResult IndexForm(Test model)
      {

      return View("index");
      }

      Sil
    3. [HttpPost]
      public ActionResult IndexForm(Test model)
      {
      if(ModelState.IsValid){
      ....
      }

      return View("Index");
      }

      Sil
    4. İki metodunuzun (Get ve Post) ismi aynı olursa, View içerisinde, form için post metodun adını ve post metod içerisinde get metodunun adını yazmanıza gerek kalmayacaktır.

      Sil
  4. Teşekkür ederim şuan mantığı daha iyi anladım fakat if(ModelState.IsValid) bu doğruluk kotrolü tam olarak formun içindeki bilgilerin bizim modelimizde belirlediğimiz tip,uzunluk,string doğrulamaları gibi bizim belirlediğimiz doğruların hepsini kontrol ediyor ve hepsi doğru ise if bloğuna giriyor yoksa validate true oluyor ve ilgili kontrolün error mesajı aktif oluyor (benim anladığım bu) doğrumudur acaba?

    YanıtlaSil
    Yanıtlar
    1. Evet, belirlenen tüm validation kontrollerinin hepsini yapıyor, bir tanesi bile yanlıs olursa, if içerisine girmemesi gerekli. Bu arada, HttpPost metodu içerisinden tekrar modeli göndermeniz gerekli. return View içerisine modeli de eklemeniz lazım. Çünkü model içerisindeki herhengibir nesne dogrulamayı gecemezse, MVC bu hatayı tekrardan model içerisine ekliyor. View sayfamızda bu hatayı, ValidationMessageFor içerisinde gösteriyor.

      Sil
  5. çok teşekkür ederim verdiğiniz bilgiler için.

    YanıtlaSil