MVC Doğrulama (Validation) Kontrolleri

1. Required

Bu nitelik ile modeldeki herhangi bir alanın 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 hata çı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.

2. StringLength

Bu nitelik ile girilecek değerin karakter uzunluğunu belirleriz. Bu tanımlama ile aynı zamanda Code First geliştirmede veritabanın oluşturulacak alan içinde, bu string uzunluğu tanımlanacaktır.

Eğer bu nitelik için maksimum karakter uzunluğu belirlenmezse, doğrulama işleminin yanı sıra veritabanı tablosundaki bu alan için nvarchar(MAX) şeklinde bir veri tipi oluşturulacaktır. Örneğin kategori sınıfı için;

[Required(ErrorMessage = "{0} alanı gereklidir.")] 
[StringLength(50, ErrorMessage = "En fazla {1} karakter uzunluğunda olmalıdır.")] 
public string Ad { get; set; } 


şeklinde bir tanımlama yaptığımızda, 50 karakterden fazla bir girdi yazarsak hata mesajı verecektir.

MinimumLength özelliği de isteğe bağlıdır. Bu özellik StringLength niteliğine bağlı bir özelliktir. Kullanımı da aşağıdaki gibidir.

[Required(ErrorMessage = "{0} alanı gereklidir.")]
[StringLength(50, ErrorMessage = "En fazla {1} karakter uzunluğunda olmalıdır.",MinimumLength=3)]
public string Ad { get; set; }


3. RegularExpression 

Regex tüm dillerde olan bir string doğrulama desenidir. MVC de de regex için bir nitelik (attribute) vardır. Regex girilen string değerin, bizim belirlediğimiz bir kurala göre olup olmadıgını belirlemek amaçlı kullanılır.

Örneğin, projemizde uye kaydı için mail alanı olsun. Bu alana kullanıcının doğru bir mail adresi girip girmediğini kontrol etmek amaçlı kullanabiliriz.

Aslında bir mail adresinin gerçek olup olmadığı o adrese mail atıp cevap gelene kadar beklemeden anlaşılmaz. Ama en azından belli bir e-posta deseni vardır. @ sembolune kadar olan kısım kullanıcı kimligi, bu sembolden sonra, mail sirketinin kimliği, daha sonra bir nokta ve bir uzantı.

E-posta adresinin regex deseni [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4} şeklindedir. Bunu sınıfımızın özelliği için nitelik olarak belirlemek için;

[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}")] 
public string Eposta { get; set; } 


şeklinde kullanırız. Böylece MVC kullanıcı girdisinin bu desene uyup uymadıgını kontrol eder. Ve önceki örneklerimizde olduğu gibi bir hata mesajı verir.

4. Range 

Bu nitelik sayısal değerler için aralık belirlemek için kullanılır. Örneğin bir yaş aralığı için;

[Range(18,40)] 
public int Yas { get; set; } 


şeklinde bir tanımlama ile kullanıcının yaşının 18 ile 40 yaşında olması gerektiğini belirtebiliriz. Bu nitelik ile yukarıda kullandığımız şekli ile sayısal değerler için aralık belirleriz, farklı overloaded metodları ile de tarih de karşılaktırabiliriz. Örneğin;

[Range(typeof(DateTime), "1/2/2004", "3/4/2004", ErrorMessage = "{0}, {1} ile {2} arasında olmalıdır!")] 
public object SatisTarihi; 


yukarıdaki kod da iki tarih aralığı belirledik, eğer kullanıcı bu tarihler arasında bir değer girmezse, ErrorMessage içerisinde yazan hata mesajı görüntülenecektir.

5. Compare 

Bu nitelik ile örneğin kullanıcı şifresini tekrar girmesini istedigimizde bu iki şifre karşılaştırılır. Örneğin; şeklinde bir tanımlama yaparsak, iki textbox içine girilen değerler otomatik olarak karşılaştırılır.

public string Sifre { get; set; } 
[Compare("Sifre")] 
public string SifreTekrar { get; set; } 


6. Remote 

Bu nitelik, sunucu taraflı bir çağrı ile istemci taraflı bir doğrulama yapmak amacıyla kullanılır. Yani; örneğin, kullanıcı adı var mı yok mu diye, kontrol etmek için veritabanına gitmek gerekli. Bunu yaparken ise istemci taraflı bir doğrulama yapmak için bu niteliği kullanabiliriz. Örneğin kullanıcı ismi için, aynı kullanıcının tekrar girilmesini istemiyorsak, Kullanici sınıfımızdaki kadi alanına Remote ekliyoruz;

[Remote("KullaniciVarmi", "Kullanici", HttpMethod = "POST", ErrorMessage = "Bu {0} zaten kayıtlı. Lütfen başka bir kullanıcı adı giriniz." , AdditionalFields = "eski_kadi")] 
[Required(ErrorMessage = "{0} alanı gereklidir.")] 
[StringLength(50, ErrorMessage = "En fazla {1} karakter uzunluğunda olmalıdır.")] 
[Display(Name = "Kullanıcı Adı")] 
public string kadi { get; set; } 


Daha sonra KullaniciController sınıfına aşağıdaki metodu ekliyoruz.

public JsonResult KullaniciVarmi(string kadi, string eski_kadi) 

 if(kadi != eski_kadi) 
      return Json(!db.kullanici.Any(model => model.kadi == kadi), JsonRequestBehavior.AllowGet); 
 else 
      return Json(true, JsonRequestBehavior.AllowGet); 


Kullanıcı eğer sistemde varsa, sayfa yenilemesi olmadan bu karşılaştırma yapılarak, hata mesajı verecektir.

Düzenleme (Edit) görünüm sayfasında (örneğimizde Views -> Kullanici -> duzelt.cshtml) aynı kullanıcı adının sorun oluşturmaması için düzenlemeden önceki kullanıcı adının KullaniciVarmi() metoduna yönlendirilmesi için aşağıdaki satırı eklememiz lazım.

@Html.Hidden("eski_kadi", Model.kadi)

Remote özelliğini kullanabilmek için jQuery ve jQuery.validate kütüphanelerinin sayfaya eklenmiş olması gerekir. Aynı zamanda Web.config içinde appSettings de aşağıdaki gibi olmalıdır ve ilgili entity'nin de System.ComponentModel.DataAnnotations (Remote özelliği için) namespace'ini kullanıyor olması gerekiyor.

// script dosyalari
<script src="~/Scripts/jquery-1.12.4.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>


<!-- web.config -->
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>


</appSettings>

Kaynak: https://mvcogren.blogspot.com/

Listeye Dön