Merhaba arkadaşlar, bugün sizlere kısaca Data Annotation dan bahsedip, custom bir data annotation örneği yapacağım.
Öncelikle Data Annotationlar, modelleri valide etmemize yarayan kuralları belirlediğimiz yapılardır. Yani biraz türkçeleştirmeye çalışırsam modelin belirlenen kurallara uyup uymadığını kontrol etmek, bu kuralları model de belirtmek için kullanırız. Bu arada model validasyonu ile alakalı daha önceden yazdığım fluent validation yazıma buradan ulaşabilirsiniz.
Basitçe, hali hazırda kullanılan System.ComponentModel.DataAnnotations altından gelen data annotationlara bir bakalım. Bu arada aşağıdakiler haricinde kullanılan farklı data annotationlar da bulunmaktadır. Ben belirli başlı olanları yazdım. Bununla beraber Entity Framework gibi kütüphaneler ile gelen farklı data annotationlarda vardır.
Required : Zorunlu alanlar için kullanılır.
DataType : Alanın veri tipini belirtmek için kullanılır. (Date,Time,Currency,EmailAdress,Password vb.)
DisplayFormat : Sayfada gösterilecek format bilgisi için kullanılır. (Tarih, Saat, Para vb.)
StringLength : Girilecek stringin uzunluğu için kullanılır.
Range : Sayısal aralık belirtmek için kullanılır.
Compare : İki alanı karşılaştırmak için kullanılır. (Password – RePassword gibi.)
RegularExpression : Regex ile kural kalıpları belirlemek için kullanılır.
Peki bu alanların yada farklı librarylerden gelen data annotationların bizim ihtiyacımızı karşılamadığı durumlarda ne yapabiliriz?
O zaman arkadaşlar ValidationAttribute sınıfından kalıtım alarak kendi data annotationımızı yazabiliriz.
Örneğin modelimizdeki string alan içerisinde “Enes” geçiyor mu diye bakan bir custom data annotation yazalım. Hatta biz parametrik olarak attribute yazalım Enes kelimesi kullanılan yerde belirtilsin.
Bu arada normalde bu senaryo Regular Expression kullanılarak yapılabilir, ben sadece örnek basit ve anlaşılır olsun diye böyle bir senaryo ürettim.
Örneğimize başlayalım.
Web-mvc proje temlpate kullanarak bir solution oluşturdum. Ve Person sınıfını ekledim.
public class Person { public int Id { get; set; } public string Name { get; set; } }
Şimdi bu modelde kullanmak için custom data annotationımı yazacağım. ValidationAttribute sınıfından kalıtım alarak sınıfımı oluşturacağım ve IsValid metodunu override ederek validasyonumu gerçekleştireceğim.
public class NotContainSpecialWordAttribute : ValidationAttribute { public string SepecialWord { get; set; } public NotContainSpecialWordAttribute(string specialWord) { this.SepecialWord = specialWord; } public override bool IsValid(object value) { string stringValue = value as string; if (!string.IsNullOrEmpty(stringValue)) { return !stringValue.Contains(SepecialWord); } return false; } }
Şimdi bunu Person sınıfımda kullanıyorum.
public class Person { public int Id { get; set; } [Required(ErrorMessage = "İsim alanı gereklidir.")] [NotContainSpecialWord("Enes", ErrorMessage = "Bu alan içerisinde Enes kelimesi geçmemelidir.")] public string Name { get; set; } }
Sınıfım ve data annotationlarım hazır. Artık ekleme, güncelleme gibi operasyonlarda, istediğim yerlerde girilen değerlerin geçerli olup olmadığını ModelState ile kontrol edebilirim.
[HttpPost] public IActionResult Create(Person person) { if (ModelState.IsValid) { People.Add(person); } return View(); }
Umarım faydalı olmuştur, kalın sağlıcakla…