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.
Merhaba Ali bey,
YanıtlaSildeslerinizi 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
Merhaba Ali bey,
YanıtlaSildeslerinizi 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
Kodları paylaşırsanız daha net cevap verebilirim. Sayfada, Validation ile alakalı scriptleriniz ekli mi?
SilTabi birde controller tarafında if(ModelState.IsValid) kontrolu lması gerekiyor.
SilSelam,
Sil--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"
}
Buaraya kadar sorun yok gibi. Post ettiginiz metodu da gorebilir miyim?
SilFormun post metodu mu?
SilEvet. Yani [HttpPost]public ActionResult Index(Test model){...} diye başlayan metod.
Silböyle bir satır yazmadım sadece Viewin içerisindeki formda "FormMethod.Post" kodu var. nasıl bir yapıdan bahsediyorsunuz acaba ?
YanıtlaSilhttp://alirizaadiyahsi.blogspot.com/2013/03/aspnet-mvc-dersleri-42-model-guncelleme.html
SilModelleri 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.
Şimdi konuyu araştırdım evet formun post olacağı kontrolü ve metodu belirttim şimdilik sadece index viewini döndürüyor.
Sil[HttpPost]
public ActionResult IndexForm(Test model)
{
return View("index");
}
[HttpPost]
Silpublic ActionResult IndexForm(Test model)
{
if(ModelState.IsValid){
....
}
return View("Index");
}
İ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.
SilTeş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ıtlaSilEvet, 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çok teşekkür ederim verdiğiniz bilgiler için.
YanıtlaSilÖnemli değil, her zaman
Sil