Mvc de action filter nedir? Ne zaman, neden ve nasil kullanilir?

  • 13.02.2016 13:13
  • ASP.Net
  • 8608

Asp.net MVC de her controller kendi icerisinde action metodlar barindirir. Ve bu action metodlar kullanici ile birebir iliski kurmamizi mümkün kılar. Bir linki tiklamak veya bir formu submit etmek gibi.Mesela biz bir linke tikladigimiz zaman,routConfig dosyasinda özel olarak belirttiğimiz controllera yonelir ve ilgili metod cagirilmis olur.

Fakat bazen öyle durumlar olur ki, bir action metod calistirilmadan once veya calistirildiktan sonra bazi mantiksal islemler yapmak isteyebiliriz. Iste boyle durumlarda action filterler kullaniriz. Action filter dediğimiz aslinda action metodlarin calisma oncesi ve sonrasina hayat veren özel attribute siniflaridir.

Action Filter Tipleri

Mvc asagidaki actin filter tiplerini barindirmaktadir:
Authorization Filter: Bu filter bir action metod calistirildiginda bu metod ile ilgili oturum kontrolü veya validasyon (doğrulama) kontrolü gibi güvenlikle ilgili kararlarin alinmasini sağlar. Bu filtreye örnek olarak AuthorizeAttribute sinifini örnek gösterebiliriz.

Action filter: Bu filtre tipi action metodlarin calismasiyla alakalidir. Şöyle ki action metoda disaridan data gondermek, action metodun geri donüş tipini kontrol etmek veya action metodun calismasini iptal etmek gibi ek işlevler saglayabilir.

Result filter: Bu filtre action metodun calismasiyla ortaya cikan sonucla, yani ActionResult objesi ile ilgilidir. Ortaya cikan HTTP response objesinin düzenlenmesi veya bu obje ile islemler yapilmasi gibi ek özellikler saglayabilir. Bu filtreye de en güzel örnek OutputCacheAttribute classidir. Cunku bu attribute action metoddan geri donen ActionResult nesnesini õnbelleğe alarak, benzer verilerin ramden cagrilmasini saglamaktadir.

Exception Filter: Eğer action metodumuzun herhangi bir yerinde işlenemeyen bir durum varsa yani bir hata meydana geldiyse bu action filter tetiklenir. Bu filtreyi hata mesajlarini loglamak veya hata sayfalarini göstermek icin kullanabiliriz. Yine bu filtreye de en güzel örnek HandleErrorAttribute sinifi gosterilebilir. Artik ActionFilter nesnelerinin ne ise yaradigini ve neden kullanildigini biliyoruz.

Simdi nasil kullanildigina bakalim: Action filter nesneleri tipik bir attribute classindan ibarettir. Ve FilterAttribute abstract classindan türetilerek oluşturulurlar. AuthorizeAttribute ve HandleErrorAttribute gibi action filter nesneleri direkt olarak FilterAttribute classindan türetilirler. Ve bu action filter nesneleri her zaman action metodlar calismadan önce cağirilirlar. Yani aslinda calismadan önce demekten kastimiz action metoda istek gider fakat ilk önce bu metoda atanmis olan attributelar calistirilir. Buna göre de action metoddan once yapilmasi gereken islemler varsa bunlar yapilir veya action metodun calistirilip calistirilmayacagina karar verilir.

OutputCacheAttribute gibi diğer action filtreler ise ActionFilterAttribute abstract classindan turetilmektedir. Ve bu tür filtreler action metodun calismasindan once de, calistirildiktan sonra da aktif hale gelirler. Bu aktiflikten kastim, her iki durumda da attributelar tetiklenir. Metod calismadan önce yapilacak birsey varsa bu islemler yapilir, calistiktan sonra da yine yapilacak islemler varsa yerine getirilir.
Action metodlari, hem action metod seviyesinde hem de controller seviyesinde kullanabilirsiniz. Action metoda uygulanirsa sadece o metodla ilgili islemlerde tetiklenir. Fakat controller seviyesinde uygulanirsa bu controllerdaki tüm metodlara uygulanir ve bu controller icerisindeki hangi metod cagrilirsa cagrilsin tanimlanmis olan actin filterlar uygunluk durumuna göre tetiklenir.

Şimdi kısaca MVC' deki HandleErrorAttribute nasıl kullanılır onu inceleyelim. Yapacağımız işlem hata yakalama işlemi olacağı için ilk önce webconfig dosyamızda aşağıdaki ayarı yaparak hata mesajlarını açıyoruz:

<configuration>
   <system.web>
      <customErrors mode="On" />
   </system.web>
</configuration>

Daha sonra projemizin ana dizininde bulunan Views klasöründeki Shared klasörüne (eğer yoksa) Errors.cshtml dosyasını ekliyoruz. (Eklemek için Shared klasörüne sağ tıklayıp Add -> View seçeneklerini takip edebilirsiniz.)

Projemizdeki tüm controller ve actionlara uygulanmasını istediğimiz bir filtre varsa bunu App_Start klasörümüzde bulunan FilterConfig dosyasında gerçekleştiriyoruz. Aşağıdaki kod satırı ile HandleErrorAttribute filtresi tüm projede geçerli olmasını istediğimi belirtiyorum. Böylece tek tek her controllera her actiona attribute tanımlamama gerek kalmıyor.

using System.Web;
using System.Web.Mvc;

namespace OsCommerce {
    public class FilterConfig {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
            filters.Add(new HandleErrorAttribute());
        }
    }
}

Yukarıdaki kodda her yerde geçerli olmasını istediğim filtreleri ekliyorum. Bundan sonraki adımda ise Global.asax dosyamda bu işlemi kayıt altına alıyorum. Bunu da aşağıdaki kod satırında görebilirsiniz.

using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace OsCommerce {
    public class MvcApplication : HttpApplication {
        protected void Application_Start() {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); //Global filtreler register ediliyor
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
}

Şu anda proje hata verdiğinde hata mesajları olduğu gibi ortaya çıkıyor. Daha düzgün bir işlem yapmak için bu hataları yakalayıp hata mesajına göre bilgilendirme yapmalıyız. Şimdi ErrorController adında bir controller ekliyoruz. (Controller -> Add -> Controller) Daha sonra 404 hata mesajlarında görüntülenmesi için NotFound actionu ekliyoruz. Eklediğimiz action içerisinde sağ tıklayıp Add View seçeneğini tıklayarak NotFound View' imizi de ekliyoruz. ErrorController son hali aşağıdaki gibi olmalı:

using System.Web.Mvc;

namespace OsCommerce.Controllers {
    public class ErrorController : Controller {
        public ActionResult NotFound() 
        {
            return View();
        }
    }
}

Artık controller ve View' imiz hazır olduğuna göre hangi hatada hangi sayfayı görüntüleyeceğimize karar vermek için webconfig dosyamızı tekrar düzenliyoruz.
 

<configuration>
   <system.web>
     <customErrors mode="On">
      <error statusCode="404" redirect="/Error/NotFound"/>
    </customErrors>
   </system.web>
</configuration>

Bu adımdan sonra yapacağınız tek işlem Error.cshtml sayfasını isteğinize göre düzenlemek. Artık proje herhangi bir 404-Not found hatasına düştüğünde direkt olarak Error Controllerindaki NotFound action metoda yönlendirilecektir. Böylece ziyaretçileri daha anlamlı bir hata sayfası ile karşılayabilirsiniz. Bu şekilde tüm hata sayfalarını yönetebilirsiniz.


kaynak / kaynak

Bu yazıya yapılan yorumlar:

  • Cihan

    11.08.2017 09:40

    Çok güzel bir makale olmuş. Elinize sağlık.

  • Ramazan Tosun

    09.06.2017 09:39

    Paylaşım için teşekkürler.

  • Hüseyin Yazıcı

    23.04.2017 10:23

    Sade ve öğretici bir yazı olmuş. iyi çalışmalar

  • serkan abacı

    01.03.2016 11:50

    guzel yararlı bır makale olmuş

  • Hamit Serbest

    15.02.2016 18:04

    Harika bir makale olmuş.

Siz de düşüncelerinizi yazabilirsiniz:

;