MVC tasarım kalıbı ile birlikte bir taşla 2 kuş değil, 1 taşla 10 kuş vurmaya alıştık bu alışkanlığı en bariz şekilde hissetiren özelliklerin başında ise MVC’nin Filters özelliği geliyor.
Filters’lar adından da anlaşılacağı gibi web uygulamanıza gelen her bir isteğin arasına girip belirli evrelerinde ihtiyacınıza göre işlemler yapabileceğiniz mekanizmalardan oluşuyor. Bu mekanizmalar bazen sayfanın çalışma zamanının alınması, bazen de güvenliği sağlayan kontroller olabiliyor. İsterseniz tüm uygulamanız için, isterseniz de belirli istekler geldiğinde filitre uygulayabiliyorsunuz.
Filters’lar method’un başına birer özellik (Attiribute) olarak kullanılmaktadır ve ActionFilterAttribute sınıfından türetilmesi gerekmektedir. Daha sonrada ihtiyacımız olan olayları override edip rahatlıkla kullanabilmektesiniz.
Yazı bir işe yarasındiye basit bir senaryo belirleyip ona göre hareket ettim, bakalım filters’lar ile neler yapabiliyoruz.
Belirlediğim gaddar senaryoya göre web uygulamama internet explorer ile girişi yasaklamak istiyorum ve bunun içinde en iyi yol Global Filters’i kullanmak olduğunu biliyorum ve aşağıdaki gibi kendi filter’imi oluşturuyorum.
using System.Web.Mvc; | |
namespace MvcApplication1.Models | |
{ | |
public class CheckBrowserAttribute : ActionFilterAttribute | |
{ | |
public override void OnActionExecuted(ActionExecutedContext filterContext) | |
{ | |
base.OnActionExecuted(filterContext); | |
} | |
public override void OnActionExecuting(ActionExecutingContext filterContext) | |
{ | |
var userAgent = filterContext.HttpContext.Request.ServerVariables["HTTP_USER_AGENT"]; | |
if (userAgent.IndexOf("MSIE") != -1) | |
filterContext.Result = new ContentResult() | |
{ Content = "<script>alert('YASAK! FireFox veya Chrome kullanın.');</script>" }; | |
base.OnActionExecuting(filterContext); | |
} | |
public override void OnResultExecuted(ResultExecutedContext filterContext) | |
{ | |
base.OnResultExecuted(filterContext); | |
} | |
public override void OnResultExecuting(ResultExecutingContext filterContext) | |
{ | |
base.OnResultExecuting(filterContext); | |
} | |
} | |
} |
Gördüğünüz gibi ActionFilterAttribute sınıfından miras aldığım 4 adet olay var. Bu olayları uzun,uzun anlatmaya gerek yok sanırım isimlerinden hangi sıra ile çalıştığı belli. Biz Controller’ımızın içindeki kod çalışmaya başlamadan önce browser kontrolünü yapacağımız için OnActionExecuting olayına kodumuzu ekleyeceğiz.
using System.Web.Mvc; | |
namespace MvcApplication1.Models | |
{ | |
public class CheckBrowserAttribute : ActionFilterAttribute | |
{ | |
public override void OnActionExecuted(ActionExecutedContext filterContext) | |
{ | |
base.OnActionExecuted(filterContext); | |
} | |
public override void OnActionExecuting(ActionExecutingContext filterContext) | |
{ | |
var userAgent = filterContext.HttpContext.Request.ServerVariables["HTTP_USER_AGENT"]; | |
if (userAgent.IndexOf("MSIE") != -1) | |
filterContext.Result = new ContentResult() | |
{ Content = "<script>alert('YASAK! FireFox veya Chrome kullanın.');</script>" }; | |
base.OnActionExecuting(filterContext); | |
} | |
public override void OnResultExecuted(ResultExecutedContext filterContext) | |
{ | |
base.OnResultExecuted(filterContext); | |
} | |
public override void OnResultExecuting(ResultExecutingContext filterContext) | |
{ | |
base.OnResultExecuting(filterContext); | |
} | |
} | |
} |
OnActionExecuting olayında ziyaretçinin user-agent bilgisinden browser’ının ne marka olduğunu öğrendik ve içinde "MSIE" stringi geçiyorsa ContentResult’u kullanarak bir JavaScript uyarısı çıkarttık. Ziyaretçinin user-agent değerinin içinde aradığımız string’i bulamasaydık Context Resul normal bir ViewActionResult() olarak gelecekti buda bize sayfayı doğru görmemizi sağlayacaktı.
Şimdi bunu filitrenin tüm Action’larda çalışmasını sağlamak için MVC uygulamamızın Global ActionFilter koleksiyonuna eklememiz gerekli. Bununda Global.asax dosyasından tek bir satır ile yapabiliyoruz. Global.asax dosyasını açtıktan sonra ilgili satırı aşağıdaki gibi ekleyin.
using System.Web.Mvc; | |
using System.Web.Routing; | |
using MvcApplication1.Models; | |
namespace MvcApplication1 | |
{ | |
public class MvcApplication : System.Web.HttpApplication | |
{ | |
public static void RegisterGlobalFilters(GlobalFilterCollection filters) | |
{ | |
filters.Add(new HandleErrorAttribute()); | |
filters.Add(new CheckBrowserAttribute()); // <= Filitremiz | |
} | |
protected void Application_Start() | |
{ | |
AreaRegistration.RegisterAllAreas(); | |
RegisterGlobalFilters(GlobalFilters.Filters); | |
RegisterRoutes(RouteTable.Routes); | |
} | |
} | |
} |
Bu işlemden sonra artık web uygulamamıza internet explorer’dan girilemeyecektir.
Gördüğünüz gibi hayatı kolaylaştıran bir özellik. Filitrelerin başka bir kullanım şeklide Action’a özel bir Attribute şeklindedir. Bunada bir senaryo üretip örnekleyelim.
Senaryoyu yine kullanıcı üzerinden geliştirmeye devam edip ziyaretçinin oturum açıp, açamadığını kontrol eden bir filter yazacağız. Senaryomuza çok ugun çünkü web uygulamalarında herkesin görebileceği ve sadece üyelerin görebileceği yerler olmakta.
using System.Web.Mvc; | |
namespace MvcApplication1.Models | |
{ | |
public class LoginRequiredAttribute : ActionFilterAttribute | |
{ | |
public override void OnActionExecuting(ActionExecutingContext filterContext) | |
{ | |
if (filterContext.HttpContext.Session["isLogIn"] == null) | |
filterContext.Result = new RedirectResult("~/Home/Login"); | |
base.OnActionExecuting(filterContext); | |
} | |
} | |
} |
Burda görüldüğü gibi basit bir Session kotrolünden başka bir şey yapmıyoruz, esas olay Action’a eklediğim Attribute ile gerçekleşiyor.
[LoginRequired]
public ActionResult Users()
{
return View();
}
Action’ın üzerine LoginRequired filitremizi koyduktan sonra bu action’a yapılan her istekte session kontrol edilecek, yoksa ziyaretçinin giriş yapması istenecektir. Ek olarak dikkat ederseniz .Net’te örf ve adetler gereği ile LoginRequiredAttribute yerine sadece LoginRequired yazabiliyoruz. tıpki Interface’lerin I ile başlaması geleneği gibi.
Burdaki uygulamayı https://github.com/c1982/oguzhan.info-Projects/tree/master/MvcApplication1 adresinden indirebilirsiniz.
teşekkürler, faydalı bir yazı olmuş.
Teşekkür ederim. Faydalı bir yazı. Güzel örnekler.
Təşəkkürlər.Faydalı məlumatlar üçün
Allah razı olsun çok güzel olmuş. Emeğine sağlık. :)
teşekkürler farklı bir anlatım olmuş.
teşekkürler güzel bir örnek, session kontrolü yapıyorsunuz ama session’ın set edildiği yer login fonksıyonu mudur ? bu set işlemi nasıl yapılıyor ?