Asp.NET MVC’de Action & Result Filtreleri

Her eylemin tabiatında bir başlangıç ve bitiş anı varsa yazılımsal algoritmalar da bu kıstaslara sahip olsa gerek.Yazılım algoritmalarında bulunan metod, olay veyahut farklı bir yapıdaki elemanın tetiklenmesi bir başlangıç ve bu tetiklenme neticesinde işlevlerin tamamlanması ise bir bitiş olarak tanımlanabilir.Asp.NET MVC mimarisinde bazı elemanlar için başlangıç ve bitiş anların da işlemler yapabilmemiz için belirli yapılar sunmuştur.Tabi bu bir tek MVC mimarisinden ibaret olmamakla beraber, sadece .NET’e özel bir durum değildir.Yukarıda da bahsettiğimiz gibi metod, olay vb. yapıların tetiklenmesi durumunda, tetiklenen elemanın cinsine göre belirli metodlar devreye girmekte ve aynı şekilde yapının işlevi son bulduğu anda da bu durum gerçekleşmektedir.İşte bu yazımızda Asp.NET MVC mimarisinde Action & Result olarak isimlendirdiğimiz metodların tetiklenme işlemlerinde devreye giren metodlardan bahsedeceğiz ve ek olarak filtre yapısından söz edeceğiz.

Öncelikle yazımızla ilgili bir husustanda bahsetmek istiyorum.Bu yazımızın ana konusu Action ve Result filtreleridir.Lakin ben kıssadan hisse yapıp konuyu direkt aktarmaktan ziyade, konuyla alakalı olan, genel yani yazılım dünyasına yatkın teorik bilgilerede yer verdiğimden dolayı başlıktan bağımsız bir içerik olduğunu düşünmeyiniz.

Evet artık konumuzla ilgilenebiliriz.
Öncelikle Action ve Result filtreleri arasındaki farkı irdelersek eğer, ‘Action Filter‘, Action metodları tektiklendiği anda yani metoddan önce çalışan filtrelerdir, ‘Result Filter’, ActionResult metodlarının işlevi tamamlandığında yani metodun bitiş anında devreye giren filtredir.

Kalıtım Aldıkları Arabirimler
‘Action Filter’ IActionFilter,
‘Result Filter’ IResult Filter

Şimdi şu soruyu sorabilirsiniz.
Tamamda arkadaş, biz bu önce ve sonra çalışan metodları nereden bulacaz ve nasıl filtre olarak kullanacaz?
Hemen cevaplarsak eğer, bu metodları hiç bir yerde bulamayacağımızı söylemek daha doğrucu olur.Lakin her hangi bir sınıfı “ActionFilterAttribute” sınıfından türetip yani kalıtım aldırarak oluşturursanız işte o zaman base sınıfı dediğimiz kalıtım alınan sınıftaki bu metodları override ederek kullanabilirsiniz.

MVC Attribute Oluşturma başlıklı yazımıza göz atarsanız eğer, “ActionFilterAttribute” sınıfı sayesinde Attribute oluşturabiliyorduk.

Hııı, demek ki şöyle düşünebiliriz.Biz herhangi bir metod tetiklendiği andan önce ve işlemi bittiği andan sonra kontrol ya da herhangi bir işlem yapacaksak eğer, “ActionFilterAttribute” sınıfından türetilmiş özel bir sınıfta birazdan göstereceğimiz metodları kullanarak gerekli ayarları yapar, haliyle bu sınıfı istediğim metodda Attribute(Nitelik) olarak kullanabilirim.Haliyle bu şekilde istediğim metodun çalışmasını filtreleyebilir ve kontrol edebilirim.

Umarım sorumuzun cevabını verebilmişimdir.

Şimdi metodlarımızı inceleyelim.

ActionFilterAttribute Sınıfından Override Edilebilen Metodlar

  • OnActionExecuted : Açtın metod çalıştırıldıktan sonra devreye giren metottur.
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                base.OnActionExecuted(filterContext);
            }
    
  • OnActionExecuting : Action metod tetiklendiği anda devreye giren metoddur.
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                base.OnActionExecuting(filterContext);
            }
    
  • OnResultExecuted: Action metod tetiklendikten sonra ActionResult tipinde sonuç döndükten sonra devreye giren metod.
            public override void OnResultExecuted(ResultExecutedContext filterContext)
            {
                base.OnResultExecuted(filterContext);
            }
    
  • OnResultExecuting: Action metod tetiklendikten sonra ActionResult tipinde sonuç döndürülmeden önce devreye giren metod.
            public override void OnResultExecuting(ResultExecutingContext filterContext)
            {
                base.OnResultExecuting(filterContext);
            }
    

Şimdi konuyu örneklendirme açısından bir uygulama yapalım.Örnek olarak bir Action metodumuz tetiklendiği anda çalıştırılmadan önce sisteme giriş yapılmış mı? yapılmamış mı? kontrol edelim.Eğer ki, sisteme giriş yapılmış ise o Action metod işlevini sürdürsün aksi halde ziyaretçiyi giriş sayfasına yönlendirilsin.

Visual Studio’da bir MVC projesi oluşturup, Controller katmanına “Home(Controller).cs” isminde Controller sınıfı ekliyorum.”Home(Controller).cs” sınıfı içerisine “Profil” adında bir ActionResult tipten metod oluşturuyorum.İşte bu “Profil” isimli Action metodumuz tetiklendiği zaman, eğer giriş yapılmışsa işlemini gerçekleştirecek yok eğer yapılmamış ise giriş sayfasına yönlendirecek.

    public class HomeController : Controller
    {
        public ActionResult Profil()
        {
            return View();
        }
    }

Şimdi Attribute’umuzu oluşturalım.Solution içerisinde “Class” isminde bir klasör oluşturarak nitelik sınıfımızı içinde oluşturuyorum.

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.RequestContext.HttpContext.Session["Kullanici"] == null)
            {
                    filterContext.RequestContext.HttpContext.Response.Redirect("http://www.google.com");
            }
            base.OnActionExecuted(filterContext);
        }

Yukarıdaki kod bloğunu incelerseniz eğer, “KullaniciKontrol” adında sınıfımız “ActionFilterAttribute” sınıfından kalıtım almıştır.İstediğimiz işlem, “Profil” Action metodu tetiklendiği andan önce kullanıcı giriş yapıp yapmadığını kontrol edeceğinden dolayı “OnActionExecuted” metodunu override ediyoruz.”Kullanici” adında bir Session değeri kontrol edildikten sonra eğer boş ise ziyaretçiyi Google amcaya yönlendirecektir.Giriş sayfası tasarlayıp birde yazımızı uzatmaktan ziyade Google’ı tercih ettim.Google’ın bu yazımızda bizim giriş sayfamız olduğunu varsayalım 🙂

Attribute’umuz tamamlandıktan sonra nasıl kullanacağımızı inceleyeceğiz.Controller katmanımızdaki “Home(Controller).cs” isimli sınıfımıza öncelikle “using MvcApplication5.Class” kütüphanesini eklememiz gerekmektedir.Tabi proje adına göre kütüphane yolu değişkenlik gösterebilir.

    public class HomeController : Controller
    {
        [KullaniciKontrol]
        public ActionResult Profil()
        {
            return View();
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer, “Profil” isimli Action metodumuzu “KullaniciKontrol” Attribute’uyla işaretlemiş olduk.

Son olarak “Profil” Action metodumuzun View katmanındaki “.cshtml” uzantılı dosyasını oluşturalım.

<h2>Gençay Yıldızın Profili</h2>

Eğer bu şekilde projemizi derleyip çalıştırırsak ve “Profil” Action metodunu tetiklersek kendimizi Google’da bulacağız.

Burada “Kullanici” isimli Session değerini doldurup bir işlem yapmayacağız.Çünkü konumuzun maksatını aşmaktadır.

Son olarak konumuzu toparlarsak eğer, çoğunlukla programlama dillerinin mimari özelliklerinde bir metodun başlangıç ve sonuç anlarında işleve giren metodlar bulunmaktadır ve bu metodlar eşliğinde mantıksal yollarla bir çok soruna çözüm bulunmaktadır.Asp.NET MVC mimarisinde bu metodlar sayesinde istediğimiz kriterleri kontrol edebiliyor ve ister Attribute istersekte farklı yapılar elde ederek projelerimizde kullanabiliyoruz.Bu şekilde esnekliği olan bir mimariyi bütün hatlarından kullanmak, istikrarlı ve hiyerarşik bir mantık çerçevesinde ortam sunar.Kompleks projeler bu yapılar ve esneklikler sayesinde kolay ve rahat bir raya girmektedirler.

Sonraki yazılarımda görüşmek üzere..
İyi çalışmalar..

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Rezan dedi ki:

    Merhaba Gençay Bey, en son verdiğiniz session kontrolü örneğini kullandığımda “System.Web.HttpException: ‘HTTP üst bilgileri gönderildikten sonra, yeniden yönlendirilemiyor.'” hatası veriyor ve sonra Layout’ta yer alan giriş formundaki @Html.AntiForgeryToken() ‘ i gösteriyor. Yardımcı olursanız sevinirim..

Bir cevap yazın

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

*