.Net 6.0 ile ModelState kullanımı (RedirectToAction)
Selamlar bu yazıda .net içerisinde RedirectToAction dediğimizde ModelState'imizin sıfırlandığını hepimiz biliyoruzdur. Çünkü model state o Action'a aittir başka bir action'a geçiş yapıldı takdirde modelState sıfırlanmış bir şekilde gelecektir. Peki ya öyle bir durumunuz var ki modelState'in taşınmasını istiyorsunuz böyle bir durumda ne yapacaksınız bugün bunu ele alacağız.
Tabi ki de ilk yöntem TempData dır biliyorsunuz ki TempData ile istediğimiz verileri bir adım öteye taşıyabiliyoruz. Peki ne demek bu bir adım öteye hadi gelin hep birlikte inceleyelim.
Örneğin ViewBag.Title="Erdinç YAŞAN" diye bir title var elimizde bu title View Açıldıktan sonra yok olur uçar gider.
Ama aynı şekilde TempData["Title"]="Erdinç Yaşan" dediğimizded View'da bunu görüntüleyebiliriz, aynı zamanda View İçerisinden başka bir controller'a yönlendirdiğimizde de o Controllerda aynı değişkene TempData["Title"] şeklinde ulaşabiliriz.
Peki bu tempdata bize ModelState korumamızda nasıl yardımcı oluyor?
Esas konumuz burası olmadığı için buraları anlatıp geçiyorum herhangi bir kod vermeyeceğim.
Örneğin modelstate içerisine Tek bir error vereceğimizi düşünelim.. TempData["ModelStateError"] diyerek bunu TempData içerisine ekledikten sonra daha sonrasında bu veriyi kurtarmak adına kontrol etmek istediğimiz Action içerisinde if(TempData.ContainsKey("ModelStateError")) diyerek kontrol ederiz eğer yukarıdaki koşulumuz doğru ise tek yapmamız gereken şey ModelState.AddModelError("",TempData["ModelStateError"]) yaparak modelState içerisine hatamızı eklemek olacaktır. Fakat her yerde bunu mu yapacağız ?
Tabi ki de bu makaleyi açma sebebim daha kolay bir yöntem olmasından ötürüdür.
ActionFilter: Nedir bu action Filter, asp.net içerisinde controller içerisinde her action çalışmadan önce ve çalıştıktan sonra çalıştırabileceğimiz fonksiyonlar mevcut ve daha da güzeli bunları kendimiz belirleyebiliyoruz.
Hemen kod kısmına geçmeden önce birlikte denemek adına yeni bir mvc projesi oluşturalım, oluşturmak istediğiniz klasöre girin ve dotnet new mvc -n ActionFilterSample diyerek boş bir proje oluşturalım. Bu oluşturduğumuz proje bize mvc alt yapısında boş bir proje verecek içerisinde bir adet Home, Bir adet Privacy action'ları ve sayfaları mevcut.
Action Filter Attributelerimizin bulunacağı bir klasör oluşturalım Adına da ActionFilters,veya Filters diyebilirsiniz.
Ben direk Filters dedim =)
Şimdi ilk önce ModelState'i tempdata içerisine atabileceğimiz bir actionFilter yazacağız ve bu actionFilter Action çalışma işlemini bitirdikten sonra çalışmalı.
Classın adına ben StoreModelStateAttribute dedim hemen class kodlarını vereyim üzerinden anlatmaya devam edelim.
Kod içerisined öncelikle ActionExecuted context içerisideki controller'ı Controllerlarımızı türettiğimiz controller olarak ele aliyorz.
Daha sonrasında ise bu controller boş değilse, İçerisimdeki modelstate'in valid olma durumunu ele aliyoruz.
TempData içerisine ne şekilde kaydetmek istiyorsanız ben Dictionary kullanarak key,value prensibinde veriler kaydediyorum.
Bir adet değişken oluşturuyoruz dilerseniz burada Dictionary Yerine List<string> de kullanabilirsiniz.
ModelState value'lerini dolaşarak Dictionary içine ekliyoruz ve son olarak oluşturduğumuz Dictionary Listesini TempData içerisine ModelState ID'si ile kaydediyoruz.
Daha sonrasında ise bu tempdata içerisine oluşturmuş olduğumuz ModelState'i kullanmak istediğimiz Action için bir adet daha ActionFilter yazacağız bu da tempdata içerisindekini modelstate'e ekleyecek onun da kodları hemen aşağıdadır.
Burada yapılan işlem ise tempData değişkeninin içerisinde ModelState adında bir ID var mı onu kontrol ediyor var ise İçerisindeki değişkenleri Dictionary<string,string> şeklinde ele alıyor.
Ele aldığı listeyi de yeni çalışacak olan action modelState'ine de ekliyoruz. İşlem bu kadar tek Yapmamız gereken bu store ve restore filtrelerini actionların başına koymak.
Restore dediğimizde tempDatayı kontrol ediyor ve model state'e ekliyoruz.
Store dediğimizde ise modelstate'i tempdata ya ekliyoruz fakat bu işlemi Action içerisinde yapmamış oluyoruz.
Aynı anda ikisini de kullanabilirsiniz sizin tercihiniz.
Yorumlar
Yorum Gönder