Web sayfalarında önemli detaylardan birisi, kullanıcı girdilerinin kontrol edilmesidir. Kullanıcı
girdilerinin kontrol edilmesi işlemine doğrulama (validation) denir.
Kullanıcı etkileşimli dinamik bir site için en önemli noktalardan birisi, kullanıcıları hata yapmaktan
kaçındırmak ve uygulamayı rahat kullanması için yönlendirmektir. Bu konuda iyi tasarlanmış bir web
sitesinde kullanıcı çok rahattır ve yanlış birşey yapmayacağına dair güvende hisseder. Çünkü nasıl olsa
uygulama hata yapmasına izin vermeyecektir. Bundan dolayı böyle bir site kullanıcı dostudur ve
ziyaretçi sayısını ciddi derecede olumlu etkiler.
Ayrıca sadece istemci tarafında değil, sunucu tarafında yapılması gereken doğrulama işlemleri de
vardır. Yani kullanıcı girdileri istemci tarafında öncelikle bir ön filtrelemeden geçer, veriler istenilen
formattaysa, bu verilerin sunucu tarafında da doğrulanması gerekebilir. Örneğin; eposta gibi. Öncelikle
istemci tarafında girilen değerin bir e-posta olup olmadığı belirlenir daha sonra bu e-posta
veritabanında kayıtlı mı diye bakılır. Bununla birlikte, bu doğrulama işlemlerinin sonucunda kullanıcıya
gösterilecek mesajlarında kullanıcı dostu olması gerekmektedir.
MVC ile doğrulama (validation) işlemleri daha basit bir yapıya kavuşmuştur. Aynı zamanda çok güçlü
bir istemci taraflı doğrulama mimarisi sunar. Tüm bunların temelinde model doğrulama (modelvalidation) yatmaktadır. Model doğrulama sistemi, DataAnnotations ile sağlanır. Yani model üzerinde
sınıfın özelliklerinin kısıtları belirlenir ve bu kısıtlar otomatik olarak model-doğrulama sistemi
tarafından yakalanır.
DOĞRULAMA KONTROLLERİNİN İNCELENMESİ
1. Required
Bu nitelik ile modeldeki herhangi bir alanın kullanıcı tarafından girilmesinin zorunlu olduğunu belirleriz.
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>
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>
Yorumlar
Yorum Gönder