Skip to main content

ASP.NET MVC 3 – IValidatableObject ile Sunucu Tarafında Model Validation

ASP.NET MVC 3 sürümünde, validation ile ilgili gelen bir diğer yenilikte IValidatableObject interface nesnesiyle sunucu taraflı doğrulama işlemlerin kolaylaştırılmasıdır. Özellikle model validation yapmak istediğimiz durumlarda
System.ComponentModel.DataAnnotations isim alanı altında yer alan attribute nesneleriyle model’e ait özellikleri(property) kolayca doğrulama işlemlerine tabi tutabiliyoruz. Tabi ki DataAnnotations nesneleri her zaman bütün doğrulama ihtiyaçlarımızı karşılamayabiliyor. Ya da bazen birden fazla property’nin yer aldığı karmaşık doğrulama işlemlerine de ihtiyaç duyabiliyoruz. Bu tip işlemlerde genellikle istemci tarafında JavaScript kodu yazarak doğrulama yapma işlemleri yapmak tercih edilse de, sunucu tarafında gerekli doğrulamaların yapılması hem kaçınılmaz, hem de en güvenli yoldur. İşte IValidatableObject interface’i sunucu tarafındaki bu görevi yerine getirmemizi kolaylaştırıyor.

ASP.NET MVC’nin M’si olan Model katmanımızdaki nesnelerimize uygulamayacağımız bu interface beraberinde Validate adında bir metot getirmektedir. Geriye IEnumerable<ValidationResult> tipinden bir liste döndüren metot, içerisinde birden fazla doğrulama kontrolü yapılıp bulunan her hata için farklı mesajlar döndürülmesini sağlar.
Önceki ASP.NET MVC 3 – CompareAttribute Sınıfı örneğinde kullandığımız Users isimli entity nesnemiz üzerinden örneğimizi yapabiliriz. Users entity nesnesine IValidatableObject interface’ini implemente ederek Validate metodunun içeriğini aşağıdaki gibi dolduruyoruz.

public partial class UserIValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        ...
        List<ValidationResult> results = new List<ValidationResult>();

        if (Username.Length < 6)
            results.Add(new ValidationResult("Kullanıcı adı en az 6 karakterden oluşmalı!"));
        if (Password.Length < 4)
            results.Add(new ValidationResult("Şifreniz en az 4 karakterden oluşmalı!"));

        if ((Password.StartsWith("19") && Password.Length == 4))
            results.Add(new ValidationResult("Şifreniz doğum tarihi gibi kolayca tahmin edilebilir bir değer olamaz!"));
        return results;
    }
}

Controller ve view dosyalarımıza ait kodları eklememe gerek duymuyorum, çünkü bu dosyalar bir önceki örnekteki dosyalarla aynı kalacak.  Views/Users/Create adresini çalıştırıp sayfası test ettiğimizde eğer istemci tarafındaki doğrulamaları başarıyla geçersek, sunucu tarafındaki Validate metodumuzun çalışacağını göreceğiz. Buradan ASP.NET MVC’nin öncelikli olarak istemci tarafında DataAnnotations attribute nesnelerini baz alarak doğrulama yaptığını, eğer bu doğrulama işlemi başarılı şekilde yapılırsa sunucuya giderek Validate metodunu çalıştırdığını görüyoruz. Yani önce property validation, sonra object validation 😉 Controller’daki Create action metodunda zaten ModelState.IsValid kontrolü yaptığımız için Validate metodu geriye içerisi dolu bir liste nesnesi döndürürse model nesnesi doğrulanamaz ve işlem iptal edilerek istemcide hata mesajı görüntülenir.

 

ASP.NET MVC 3 – IValidatableObject ile Sunucu Tarafında Model Validation” hakkında 3 yorum

  1. Çok dogru bir yazı oldugunu düşünmüyorum,cünkü yazınızda belirttigini gibi bu işler ne kadar complex olursa olsun zaten attribute’ler ile yapilabiliniyor,

    Egerki datamodel’e yazilirsa sunucu tarafli, viewmodele yazilip razor tarafinda validationsummary ve ValidationMessageFor konulursada, client side baska bir aksiyona gerek kalmadan kendisi halledebilir, Yazı çok dogru degil demişim ancak, bence kafa karıştırıcı ve gereksiz, biraz daha agır konulara yönelelim bir unity yazısı göremedik mesela.

  2. Bu tip custom validation’lar attribute’larla da yapılabilir doğru, hatta tek bir attribute yazarsınız içerisinde validation, logging, authorization, data encryption… herşeyi de yazarsınız tıkır tıkır da çalışır. Yazıda aksini belirtmemişim zaten, sadece gelen yeni bir özelliği kullanarak bir ihtiyacı hızlıca ve basit şekilde nasıl çözersiniz anlatmışım. Okuyan kişi zaten aklına yatarsa kullanır, yatmazsa gider kendi attribute’unu yazar.

    Bu kadar basit ve kolay bir kullanımı hem kafa karıştırıcı bulmak, hem daha ağır yazılar istemek biraz enteresan olmuş :) Yeterli ağırlıkta yazılar yazdığımı düşünüyorum, unity anlatılması gerektiğinde çok derinlere girmek, hatta ön hazırlık yazılarının da yazılması gereken bir konu, o kadar kapsamlı çalışma yapmaya zamanım olmadı, kolay kolay olmazda. Ama google’dan aratınca yeterli miktarda ve ağırlıkta yazılar bulacağınıza eminim.

  3. Bazı durumlarda validation attirbute lar ile doğrulama yapmak çok kolay olmuyor.Örneğin şarta bağlı validasyonları attribute lar ile yapacağım derseniz göbeğiniz çatlar. Bu gibi durumlar için yerinde bir interface bence.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir