MVC ActionFilter ActionFilterAttribute CustomActionResultAttribute
MVC ActionFilter ActionFilterAttribute CustomActionResultAttribute

MVC ActionFilter ActionFilterAttribute CustomActionResultAttribute Model-View-Controller katmanı üzerinde belirli olayların rutin halde işlenmesi, kod fazlalıklarının giderilmesi, okunabilirlik, uygulanabilirlik başlıklarının bence tam anlamıyla hakkını veren ve uygulamanıza esneklik katacak değerlerin daha az kod daha çok iş mantığıyla işlendiği yapıdır.  Filtreler çeşitli Attribute ve Interface’ler üzerinde belirli bölümlere ayrılmışlardır.

Genel hatlarıyla 4 ana başlık ile inceleyebiliriz , kullanımları aynı veya birbirine çok yakındır.

  • Authorization Filter
  • Action Filter
  • Result Filter
  • Exception Filter

Yukarıda bahsettiğim gibi MVC Filtreleri çeşitli Interface ve Attribute’lar üzerinden kullanıma sunulmuştur.Aşağıdaki tablo’da basit bir gösterimini bulabilirsiniz.

AuthorizationFilter  IAuthorizationFilter  AuthorizeAttribute
ActionFilter  IActionFilter  ActionFilterAttribute
ResultFilter  IResultFilter  ActionFilterAttribute
ExceptionFilter  IExceptionFilter  HandleErrorAttribute

 

Belirttiğim Filtrelerin hepsi FilterAttribute sınıf üzerinden miras almış ve ilgili Interface ile zorunlu metotları implement edilmiştir. Şimdi Filtreleri genel hatlarıyla açıklamadan önce ActionFilterAttribute özelliğimizi ele alıp sınıf (class) yapısına bir göz atalım.

ActionFilterAttribute metadata incelemesinde sınıfın abstract olduğunu görüyoruz. O halde bu sınıf üzerinden miras alarak isteklerimizi özelleştirdiğimiz Attribute sınıflar yazabiliriz. Sınıf içerisinde .Net ‘ in farklı Attribute’larının kullanıldğını görüyoruz Örneğin AttributeUsage ile ActionFilterAttribute özelliğinin sınıf ve method’larda kullanılabileceği belirtilmiştir. Türetildiği FilterAtrribute üzerinden AllowMultiple ve Order gibi özellikler almış. AllowMultiple ile birden fazla instance için Filtre uygulamayı Order ile filtrenin öncelik sırasını set etmek için kullanılır. Henüz hiçbir metodu override etmedik. Şimdi bu kısmı ele alalım. ActionFilterAttribute sınıfında IActionFilter ve IResultFilter Interfacelerini görüyoruz.  Bizim kodlarımızı yazacağımız çeşitli filtreler eklememizi sağlayan metotlar aşağıdaki gibidir.

IActionFilter

IResultFilter

Şimdi yukarıda tablo görünümünde verdiğimiz filtreler için kısa açıklamalar ekleyelim.Dip notumuzla beraber örneğimize geçebiliriz.

AuthorizationFilter

 IAuthorizationFilter Interface’inden implement edilmiştir. Güvenlikle ilgili karar mekanızması oluşturmada bize yardımcı olur. Bu filtre diğer fitrelerle beraber kullanılsa bile ilk sırada çalışacaktır.

ActionFilter

IActionFilter Interface’inden implement edilmiştir. ActionMethodlar çalışırken şlkem yaparlar. Interface üzerinden  farklı metot alır. OnActionExecuting ve OnActionExecuted. ActionResult objesi çalışmadan önce OnActionExecuting çalıştıktan sonra OnActionExecuted metodu çalışır. Bu sayede metodun çalışıp çalışmayacağına karar verebilir.

ResultFilter

 IResultFilter Interface’inden implement edilmştir. OnResultExecuting ve OnResultExecuted metodları vardır. HTTP Respons’ a göre çeşitli filtreler kullanmamızı sağlar.

ExceptionFilter

Hata durumlarında çalışan filtredir. Hata durumlarında bazı loglar almak yada kullanıcı dostu bir hata sayfası gösterimi için kullanılabilir.

Not : Yukarıdaki filtreler üç farklı şekilde uygulanabilmektedir.

Global.asax ile tüm projede kullanılabilir
Controller kullanımı ile uygulanan controllerda tüm metotlarda kullanılabilir
ActionResult metot bazında kullanılabilir

Şimdi örnek senaryomuzu oluşturup kodlarımızı yazabiliriz.

Senaryomuzu ActionFilter üzerinden oluşturacağız.  Kullanıcı ve Öğrenci bilgilerinin olduğu bir sistemde oluşturacağımız CustomFilterAttribute’lar ile görüntüleme ve silme yetkilerini oluşturacağız. Kayıt silme için bir iş kuralımız olacak. Her kullanıcı kendi oluşturduğu kaydı silebilecek. Şimdi kodlarımızı yazmaya başlayalım.

bilisimIOActionFilter adında MVC projesi oluşturuyoruz.

Projede kullanacağımız modelleri oluşturalım. Aşağıda oluşturduğumuz model’ler ile Öğrenci kullanıcı ve kullanıcı yetki bilgilerini saklayacağız.

Data Sınıfı

Projemizde database gibi kullanacağımız bir sınıf oluşturalım.  Kullanıcı , yetki ve yetki detaylarını bellek üzerinde saklayıp işlem yapacağız.

Projemiz çalıştığında sınıftan bir instance alınıp kullanıma hazır olabilmesi için Global.asax dosyasında Application_Start metodunda sınıfımızdan yeni bir instance ile yapıcı metodu tetikleyip test datalarımızı kullanıma hazır hale getireceğiz.

Projemize SessionHelper sınıfı ekliyoruz.  Kayıtlı kullanıcı bilgisini burada tutacağız.

View

Senaryomuzun tam anlamıyla oturması için birkaç view ekleyeceğiz.  View klasörü altında Student klasörü oluşturuyoruz.  Klasöre sağ tıklayıp Add View ile CreateStudent , Delete , StudentList view’larını oluşturuyoruz. CreateStudent sayfamız için Create Template, StudentList için List template ve Delete sayfamız için Delete template ‘kullanıp Model class kısmında Student model seçiyoruz. Bu şekilde MVC bizim için en temel özellikleriyle işimizi görecek sayfaları otomatik oluşturuyor.

mvcFilter

Viewların son hali aşağıdaki gibi olacaktır.

Son olarak Controller tanımlarımız ve Atribute sınıfımızı ekleme işlemleri kaldı.

Student Controller içinde CanDelete ve CanShow Attribute’larını ActionResult metodlar üzerinde görmüşsünüzdür. Şimdi ActionFilterAttribute üzerinden türettiğimiz CanDelete ve CanShow Filter attribute’larımızı yazalım.

ActionFilterAttribute CanShow CanDelete

Yukarıda tanımladığımız CanShow ve CanDelete sınıfları ActionFilterAttribute sınıfından türetilmiş ve metodlarını miras almıştır. Yazımızın başında belirttiğimiz OnActionExecuting metodu override edilip attribute’un tanımlandığı action çağırılmadan önce yetki kontrollerimizi yapacaktır. CanDelete FilterAttribute ile Sistemde tanımlı kullanıcının silme yetkisi kontrol ediliyor.Silme yetkisi yoksa anasyfaya dönüp ekrana uyarı mesajı veriyoruz. Silme yetkisine sahip bir kullanıcı başka bir kullanıcının oluşturduğu bir kaydı silmeye çalışıyorsa burada da bir kısıtlama getirip sadece kendi oluşturduğu kayda silme yetkisi veriyoruz. Aynı şekilde CanShow attribute ile görüntüleme yetkisine sahip olmayan bir kullanıcı sistemdeki öğrencileri göremeyecektir.

Bu yazımda MVC ActionResultFilter konusunu gerçekçi bir örnekle ele almaya çalıştım. Umarım yararlı olmuştur.

Örnek proje kodlarına aşağıdan ulaşabilirsiniz.

MVC Filters – ActionFilter Kullanımı

Referans

Filtering in ASP.NET MVC

 

CEVAP VER

Please enter your comment!
Please enter your name here