Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

MVC’de IsValidField Metodu

Bu yazımda MVC mimarisinde IsValidField metodunu ele alacağız.Mevzu bahis olan metodun teşkil ettiği önemi göstermek, anlatabilmek için şöyle bir yapı üzerinden konuyu ele alacağım.Günümüzdeki web sitelerinin genelinde içerik arama yapısı mevcuttur.Yani ben çalıştığım projelerin %90’ında, siteye özel içerik arama motoru yaptığımı biliyorum.MVC mimarisi ile çalışılan siteler üzerinde de arama motoru yapacağımız durumlar da, beklemediğimiz olası durumlar oluşabilir.Özellikle MVC mimarisinde bu konunun içeriğiyle bağdaşık bir durumla karşılaşacağız ve bu engeli IsValidField metodu ile aşacağız.

Yukarıdaki paragrafta, konuya giriş pek aydınlatıcı bir şekilde olmasada, MVC mimarisiyle üzerinde çalışılan bir projenin içerik arama motoru yapılırken çıkabilecek hata üzerine konuşacağız.

Misal olarak, bir tablo üzerinde arama işlemleri yapacağız.Varsayalım ki, o tablonun kolonları işlenmesi için “Bind” edilmiş ve Validation kontrollerine tabii tutulmuş.Örnek olarak aşağıdaki gibi;

        [Required(ErrorMessage="Lütfen boş geçmeyiniz.")]
        [StringLength(50,ErrorMessage="Lütfen 50 karakteri aşmayınız.")]
        public string Kolon1 { get; set; }

        [Required(ErrorMessage = "Lütfen boş geçmeyiniz.")]
        public string Kolon2 { get; set; }

        [Required(ErrorMessage = "Lütfen boş geçmeyiniz.")]
        public string Kolon3 { get; set; }

Bu yapıya sahip bir tablo üzerinde arama işlemi yapacak [HttpPost] Attribute’una sahip Action metodumuzu yazdığımız zaman, “ModelState.IsValid” komutu ile, Validation işlemlerinin kontrolünü yapmamız gerekecektir.Ha yapmasakta olur ama madem böyle bir tedbir alınmış, taktirinide göz ardı etmemek gerek.

Arama yapılacak tablonun bütün kolonlarından ziyade tek bir kolonda arama yaptıracağımızı düşünelim.

Arama işlemini sadece “Kolon1” adına sahip kolonumuz üzerinde yapacaksak eğer, yazacağımız Action arama metodumuz da, “ModelState.IsValid” kontrolü yaptığımız zaman hata alacağız.Bu alacağımız hatanın sebebini şu şekilde izah edeyim.

Kullanıcı, View katmanı sayesinde görebildiği form üzerinde arama işlemi yapmak isterse eğer, sadece “Kolon1” isimli kolona yazı yazacaktır.Normal’de, bu yazılan yazı post edilince veritabanına gidip, sorgumuza uyan şekilde sonuç döndürmesi gerekiyor.Çünkü, “Kolon1” isimli kolonun “Required” Attribute’u “True” değeri dönecektir.

Ancak, yazılım konusu bazen düz mantıkla çalışmamaktadır.Her ne kadar kullanıcı “Kolon1” kolonu üzerinde işlem yapabilse de, post işlemi sonucunda, o sayfanın kullandığı modelin diğer propertylerinde “Required” kontrolü varsa eğer, boş geçildiklerinden dolayı “False” değeri döndüreceklerdir ve işlemimiz hatayla sonuçlanacaktır.Dikkat ederseniz, “Kolon2” ve “Kolon3” isimlerine sahip kolonlar “Required” Validation kontrolüne tabii tutulmaktadır.

        //Tablomuzun adı "AramaTablo"
        VeritabaniDataContext Veri = new VeritabaniDataContext();
        public ActionResult Index()
        {
            if (Session["SorguSonucu"] != null)
            {
                List<AramaTablo> Sonuc = Session["SorguSonucu"] as List<AramaTablo>;
                return View(Sonuc);
            }
            else
            {
                return View(Veri.AramaTablos);
            }
        }
        public ActionResult Ara()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Ara(AramaTablo Sonuc)
        {
            if (!ModelState.IsValid)
                return View(Sonuc);
            try
            {
                List<AramaTablo> SorguSonucu = (from Kolon in Veri.AramaTablos
                                                where Kolon.Kolon1.Contains(Sonuc.Kolon1)
                                                select Kolon).ToList();
                if (Session["SorguSonucu"] != null)
                {
                    Session["SorguSonucu"] = SorguSonucu;
                }
                else
                {
                    Session.Add("SorguSonucu", SorguSonucu);
                }
                return RedirectToAction("Index");
            }
            catch (Exception)
            {
                throw;
            }
        }

Eğer bu şekilde bir arama işlemi yapmaya çalışırsak “Requried” Validation kontrolünü aşamayacak ve işlem gerçekleştirilmeyecektir.

Sadece “Kolon1” ismindeki kolonda arama yaptığımızdan dolayı, “ModelState.IsValid” kontrolü diğer propertylerin Validation kontrollerinden dolayı bize işlem yaptırmıyor.Bu durumu aşabilmek için, “ModelState” ile kontrol yaparken, o anki işlevin sadece “Kolon1” üzerinde işleneceğini göstermemiz gerekmektedir.Bu işlemide IsValidField metodunu kullanarak rahatlıkla yapabiliriz.

[HttpPost]
        .
        .
        .
        public ActionResult Ara(AramaTablo Sonuc)
        {
            if (!ModelState.IsValidField("Kolon1"))
                return View(Sonuc);
        .
        .
        .

Eğer bu şekilde kodumuzu düzeltirsek, o sayfanın modeli üzerinde sadece “Kolon1” adındaki propertynin adında işlem yapacağımızı ve onu kontrol etmesi gerektiğini söylemiş oluyoruz.

Bu yazımda da IsValidField metodu hakkında detaylı bir bilgi aktarmış oldum.Umarım faydalanırsınız.
Bir sonraki yazımda görüşmek üzere..
İyi çalışmalar 😉

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

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