Custom Data Annotation Hazırlamak

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.
jean-philippe-delberghe-unsplash-pattern
jean-philippe-delberghe-unsplash-pattern
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();
}
Validation Error Message
Validation Error Message

Umarım faydalı olmuştur, kalın sağlıcakla…

Written By

Bir önceki günden daha iyi olmak için çalışarak kendimi geliştirmek, öğrendiklerim ve öğreneceklerim ile yazılım sektöründe büyük ölçekli ve uluslararası projelerde kendimden söz ettirmek istiyorum.

More From Author

You May Also Like

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir