Ana içeriğe atla

C# Doğrulama (Validation) Kontrolleri - 1

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. 
Ö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>

Yorumlar

Bu blogdaki popüler yayınlar

C# Doğrulama (Validation) Kontrolleri - 2

Web sayfalarında (c# kullanılarak hazırlanan) kullanılan kullanıcı kontrollerinin bir kısmını bir önceki yazımızda paylaşmıştık.  Diğer kullanıcı kontrollerini de aşağıda bulabilirsiniz. 1. DisplayName  Model içerisinde tanımladığımız alan adının, view sayfasında nasıl görüneceğini belirliyoruz ve LabelFor içerisinde çağırdığımızda bu nitelik çalışmaktadır. Alternatif olarak Display(Name="isim") şeklinde de kullanılabilir. Örneğin, Ad alanının Kategori olarak görünmesi için aşağıdaki gibi tanımlama yapılır. Model sınıfı içerisinde kategori adı tanımlaması: [DisplayName("Kategori")]  public string Ad { get; set; }  view sayfasındaki tanımlama: <div class="editor-label">@Html.LabelFor(model => model.Ad)</div> <div class="editor-field">@Html.TextBoxFor(model => model.Ad)</div> <div>@Html.ValidationMessageFor(model => model.Ad)</div> 2. ScaffoldColumn Düzenlenmesini istemediğimiz mod...

Adım Adım MVC Öğreniyorum

Merhabalar, Günümüz web tasarımın tartışmasız en yeni teknolojilerinden olan mvc yapısı ile ilgili İnternet de sayısız doküman bulabilirsiniz. Ancak bu dokümanların içinde sizi sıfırdan belirli bir seviyeye getirecek bir doküman bulmak çok zor. Özellikle Türkçe kaynak olarak bu eksikliği tamamlamak adına, iki arkadaş olarak hazırladığımız dokümanın pdf halini İnternet ortamında ücretsiz olarak paylaşmaya karar verdik. Hazırladığımız bu c# mvc dokümanı ile, yönetim paneli olan bir sitenin sıfırdan nasıl yapıldığını öğrenebilirsiniz. Yönetim panelinde genel olarak şu modüller bulunmaktadır: Kullanıcı Yönetimi Modülü Sayfa Yönetimi Modülü Tur Yönetimi Modülü Partial View Kullanımı Yorumlar Modülü Rezervasyon Modülü Doğrulama (Validation) İşlemleri Resim Yükleme İşlemleri Projeyi Yayınlamak Bu doküman ile ilgili soru ve görüşleriniz için yorum yapabilirsiniz. Görseller: İndirme: C# MVC Dokümanı indirme bağlantısı aşağıdadır. ...