Makale Özeti

Önceki çalıştığım işyerinde proje bir web projesiydi. Ama ben web kısmından çok veri erişim ve modelleme tarafındaydım. Proje yöneticimiz kullandığımız nesnelerin özelliklerinin (property) kısıtlarının (zorunlu alan, karakter uzunluğu vs.) kod tarafında verilerek bunların web sayfalarına taşınmasını istedi. Aslında bu noktada daha önceden standart kullandığımız Asp.net validasyon kontrolleri var. Ama ekrana atılan her kontrole karşılık hata mesajı değerini oluşturmalı ve bir özellik için birden fazla kontrol yapmak istediğimizde ekrana birden fazla validation kontrolü kullanmak durumundayız.

Makale

Önceki çalıştığım işyerinde proje bir web projesiydi. Ama ben web kısmından çok veri erişim ve modelleme tarafındaydım. Proje yöneticimiz kullandığımız nesnelerin özelliklerinin (property) kısıtlarının (zorunlu alan, karakter uzunluğu vs.) kod tarafında verilerek bunların web sayfalarına taşınmasını istedi. Aslında bu noktada daha önceden standart kullandığımız Asp.net validasyon kontrolleri var. Ama ekrana atılan her kontrole karşılık hata mesajı değerini oluşturmalı ve bir özellik için birden fazla kontrol yapmak istediğimizde ekrana birden fazla validation kontrolü kullanmak durumundayız. Küçük bir proje yapıyorsak bu işimizi görebilir. Ancak daha büyük projelerde daha profesyonel bir yöntem bulmak daha iyi olacaktır diye düşünüyorum. (En azından proje yöneticim bu bakış açısını bana kazandırdıktan sonra :)) Bu amaçla; veri erişim katmanında veri doğrulama yapabilmek için Asp.net MVC Framework ile birlikte gelen ve System. ComponentModel.DataAnntations dll’ i içerisinde yer alan validasyon niteliklerini (validation attributes) kullanıyoruz.

Öncelikle bu nitelikler (attribute) ve işlevleri nelerdir bir bakalım:
Required: Boş geçilemez alanlara uygulanır.
StringLength: Veri uzunluğu belli bir karakter sayısını geçemez alanlar için uygulanır.
Range : Değeri belli bir aralık dışına çıkamayacak alanlar için uygulanır.
Regular Expression : Belli bir formatta oluşturulması gereken alanlar için uygulanır.
Şimdi örnek bir uygulama yaparak yukarıda bahsettiklerimizi koda dökelim. Öncelikle bir web projesi açıyoruz. Projemize aşağıdaki gibi çok fonksiyonel olmayan basit bir sınıf yazıyoruz.

public class Uye

{

public int ID { get; set; }

[Required(AllowEmptyStrings = false, ErrorMessage = "Ad bilgisi boş geçilemez.")]

public string Ad { get; set; }

[Required(AllowEmptyStrings = false, ErrorMessage = "Soyad bilgisi boş geçilemez.")]

public string Soyad { get; set; }

[Range(18, 65, ErrorMessage = "Yaş 18'den küçük 65'ten büyük olamaz.")]

public int Yas { get; set; }

[StringLength(11, ErrorMessage = "Telefon bilgisi 11 haneli olmalıdır.",MinimumLength=11)]

[Required(ErrorMessage = "Telefon bilgisi boş geçilemez.")]

public string Telefon { get; set; }

[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Mail adresini istenilen formatta giriniz.")]

public string Mail { get; set; }

}

Daha sonrasında özelliklerimize yazdığımız doğrulama kontrollerini kullanmak amacıyla kendi  validasyon kontrolümüzü yazıyoruz.

[ToolboxData("<{0}:DataAnnotationValidator runat=server></{0}:DataAnnotationValidator>")]

public class CustomValidator:BaseValidator

{

public string PropertyName { get; set; }

public string ObjectType { get; set; }

 

protected override bool EvaluateIsValid()

{

Type type = Type.GetType(ObjectType);

PropertyInfo pi = type.GetProperty(PropertyName);

string value = GetControlValidationValue(ControlToValidate);

 

ValidationAttribute[] validationAttribues = pi.GetCustomAttributes(typeof(ValidationAttribute), false) as ValidationAttribute[];

for (int i = 0; i < validationAttribues.Length; i++)

{

if (!validationAttribues[i].IsValid(value))

{

ErrorMessage = validationAttribues[i].ErrorMessage;

ToolTip = validationAttribues[i].ErrorMessage;

return false;

}

}

return true;

}

}

Kendi yazdığımız validasyon kontrolü Asp.net validasyon kontrollerinin özelliklerini sağlayabilmesi için BaseValidator sınıfından kalıtılır. Yukarıda da görüleceği gibi kendi kontrolümüzün 2 tane özelliği bulunuyor:
PropertyName : Bu validasyon kontrolünün sınıf  (buradaki Uye sınıfı )üzerindeki hangi özelliği doğrulayacağını (Validate) gösteren özelliktir.
ObjectType : Bu validasyon kontrolünün hangi sınıfta kullanacağını gösteren özelliktir.

GetControlValidationValue(ControlToValidate) metodu; BaseValidator sınıfından gelen ControlToValidate özelliğini parametre alarak validasyonu yapılmak istenen özelliğin değerini string olarak geri döndürür. Buradaki ControlToValidate özelliği web sayfası tarafında validasyonu yapılmak istenen kontrolün adıdır. Yukarıdaki kod parçasında PropertyName ile belirtilen sınıfa ait ilgili özelliğinin ValidationAttribute sınıfından kalıtılan nitelikleri bir diziye alınır. Daha sonra döngü ile her nitelikte gezilerek IsValid metodu çağırılarak şartı sağlayıp sağlamadığına bakılır. Şartı sağlamayan ilk validasyonda yine BaseValidator sınıfından gelen ErrorMessage özelliğine sınıfının özelliğinin ilgili ValidationAttribute’una yazılan hata mesajı set edilir.

Yapılan Doğrulama (Validasyon) Web Sayfasında Kullanılması :
Öncelikle yazdığımız CustomValidator’ın sayfada kullanılabilmesi için aşağıdaki gibi bir tanımlama yapılır.

<%@ Register Assembly="DataAnnotations" Namespace="DataAnnotations" TagPrefix="cc1" %>


Assembly: Yazılan kontrolün hangi Assembly altında bulunduğunu ifade eder.
Namespace: Yazılan kontrolün ilgili Assembly içersinde hangi namespace altında bulunduğunu ifade eder.
TagPrefix : Kullanılan kontrolün başında bulunacak tanımlama( ön ek). örneğin bir ASP.net kontrolünün başında asp: ön ekinin bulunması gibi.  Daha sonra yukarıdaki gibi bir ekran tasarlıyoruz. Web sayfamızın Design kısmını hazırladıktan sonra Markup tarafına geçiyoruz ve her bir Textbox kontrolümüzün yanına aşağıdaki koddaki gibi yazdığımız CustomValidator kontrolünü koyuyoruz ve ilgili özelliklerinin değerlerini atıyoruz.Bu arada amacımız sadece validasyon yapmak olduğu için aslında Kaydet butonunun arkasına herhangi bir kod yazmıyoruz.

<cc1:CustomValidator ID="CustomValidation1" runat="server" ControlToValidate="txtAd" PropertyName="Ad" ObjectType="DataAnnotations.Uye,DataAnnotations" ></cc1:CustomValidator>

ControlToValidate özelliğine hangi Textbox’ın kontrolünü gerçkleştirmek istiyorsak o kontrolün adını, ObjectType özelliğine ise hangi sınıfa ait özelliği kontrol etmek istiyorsak o özelliği Namespace’i ile birlikte yazıyoruz. Şimdi sıra geldi projemizi çalıştırıp sonuçları görmeye. Öncelikle sayfadaki hiç bir textbox’ı doldurmadan sayfanın Postback olmasını sağlamak amacıyla Kaydet butonuna basıyoruz. Sonuç çıktımız aşağıdaki gibi olacaktır. Burada dikkat ederseniz Uye sınıfında Telefon özelliğine 2 adet validasyon niteliği eklediğimiz halde öncelikli olarak Required olan nitelik kontrol edilir. Şimdi de bazı verileri girerek diğer validasyon niteliklerinden çıkan sonucu inceleyelim. Biz burada sadece istemci tarafında kontrol yaptık. Javascript’in kapalı olduğu tarayıcılarda bu kontroller gözden kaçar ve veriler sunucu tarafında herhangi bir kontrol işlemi yoksa hatalı olarak kaydedilebilir. Bu durumun önüne geçmek için sunucu tarafında da sınıfınızın özelliklerindeki nitelikleri okuyarak doğrulama işlemi yapan metotlar yazabilir. Buradan dönen sonuca göre veri düzgün ise kayıt işlemini gerçekleştirebilir hatalı ise hata fırlatabilirsiniz. Böyle bir yazının daha sonuna geldik. Umarım faydalı bir yazı olmuştur.