با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش ASP.NET MVC ، را دنبال می کنند. در ASP.NET MVC درخواست کاربر به کنترلر مناسب و متد اجرایی هدایت می شود. با این وجود ممکن است شما بخواهید بعضی از قسمت ها را قبل یا بعد از یک متد اجرایی ، اجرا کنید. برای این منظور ASP.NET MVC فیلترهای مناسب را معرفی می کند. برای آشنایی با کاربرد و چگونگی استفاده از کلاس سفارشی ASP.NET MVC Filter یا فیلترها در ASP.NET MVC در ادامه ی مباحث با ما همراه باشید.
ASP.NET MVC Filter یک کلاس سفارشی است که در آن شما می توانید بخش هایی را برای اجرای قبل یا بعد از یک متد اجرایی مشخص کنید.
فیلترها در ASP.NET MVC Filter را می توان به یک متد اجرایی یا کنترلر و یا یک برنامه اعمال کرد.
فریم ورک MVC شامل انواع مختلفی از فیلترها می شود.
جدول زیر لیستی از فیلترهای MVC را نشان می دهد، فیلترهای built-in برای نوع و رابط کاربری که باید برای ایجاد کلاس فیلتر، پیاده سازی شود بکار می رود.
Filter Type | توضیحات | Built-in Filter | Interface |
---|---|---|---|
Authorization filters | قبل از اجرای متد اجرایی، احراز هویت و مجوز را انجام می دهد. | [Authorize], [RequireHttps] | IAuthorizationFilter |
Action filters | بعضی از عملیات قبل و بعد از انجام یک متد اجرایی انجام می شود. | IActionFilter | |
Result filters | بعضی از عملیات قبل یا بعد از اجرای نمایش را انجام می دهند. | [OutputCache] | IResultFilter |
Exception filters | بعضی از عملیات ها را انجام می دهند | [HandleError] | IExceptionFilter |
یک فیلتر استثنایی زمانی اجرا خواهد شد که یک استثنای ناامن در برنامه ی شما وجود داشته باشد.
کلاس HandleError یک کلاس فیلد استثنایی ساخته شده در چارچوب MVC است.
فایل Error.cshtml بطور پیش فرض در فولدر Shared قرار گرفته است.
مثال زیر فیلتر HandError را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [HandleError] public class HomeController : Controller { public ActionResult Index() { //throw exception for demo throw new Exception("This is unhandled exception"); return View(); } public ActionResult About() { return View(); } public ActionResult Contact() { return View(); } } |
در مثال فوق ما ویژگی [HandleError] را به HomeController اعمال کرده ایم.
بنابراین حالا اگر هیچ متد اجرایی از HomeController به استثنای unhandled اجرا نشود، صفحه ی Error نمایان می شود.
لطفا توجه کنید که استثنای unhandled با بلاک try-catch تغییر نمی کند.
فیلترهایی که به کنترلر اعمال می شوند، بصورت خودکار به تمام متدهای اجرایی یک کنترلر اعمال می شوند.
لطفا مطمئن شوید که حالت CustomError در بخش System.web از web.config قرار دارد تا HandleErrorAttribute به درستی کار کند:
مثال:
1 | <customErrors mode="On" /> |
حالا اگر شما برنامه را اجرا کنید ، یک صفحه ی خطا را مشاهده خواهید کرد. چراکه ما از متد اجرایی Index برای اهداف آزمایشی استفاده کردیم.
بنابراین ویژگی HandleError صفحات عمومی خطا را برای هر استثنای دستکاری نشده در HomeController نمایش می دهد.
فیلترها را می توان در سه سطح اعمال کرد.
شما می توانید فیلترها ی سطح عمومی را در رویداد Application_Start
از فایل Global.asax.cs اعمال کنید.
با استفاده از فایل پیش فرض FilterConfig.RegisterGlobalFilters()
فیلترهای عمومی به تمام کنترلرها و متدهای اجرایی یک برنامه اعمال می شود.
فیلتر [HandleError] بصورت پیش فرض در هر برنامه ی MVC با استفاده از Visual Studio اعمال می شود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // MvcApplication class contains in Global.asax.cs file public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); } } // FilterConfig.cs located in App_Start folder public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } } |
فیلترها می توانند همچنین به کلاس کنترلر اعمال شوند. بنابراین، فیلترها در صورتی که به یک کلاس کنترلر اعمال شوند، به تمام متدهای اجرایی کلاس کنترلر نیز، اعمال می شود.
مثال – فیلترهای اجرایی در کنترلر :
1 2 3 4 5 6 7 8 9 | [HandleError] public class HomeController : Controller { public ActionResult Index() { return View(); } } |
شما می توانید فیلترها را به یک متد اجرایی شخصی نیز اعمال کنید. در این صورت فیلترها فقط در همان متد اجرایی خاص قابل اجرا خواهند بود.
مثال- فیلترها در متد اجرایی :
1 2 3 4 5 6 7 8 9 | public class HomeController : Controller { [HandleError] public ActionResult Index() { return View(); } } |
شما می توانید چندین فیلتر داخلی یا سفارشی را در سطح عمومی یا در سطح کنترلرها یا متداجرایی برای اهداف مختلف مانند [مجاز]، [RequireHttps]، [ChildActionOnly]، [OutputCache]، [HandleError] استفاده کنید.
همانطور که در بالا ذکر شد، MVC شامل انواع مختلفی از فیلترها می باشد و چندین فیلتر را می توان به یک کلاس کنترلر یا متداجرایی اعمال کرد. بنابراین، فیلترها در دستور زیر اجرا می شوند.
با اجرای یک رابط فیلتر مناسب که می توانید یک فیلتر سفارشی ایجاد کنید.
می توانید ویژگی های فیلتر سفارشی را ایجاد کنید.
همچنین یک Class Filter Attribute را ایجاد کنید تا بتوانید از آن کلاس به عنوان یک ویژگی استفاده کنید.
برای مثال از پیاده سازی کلاس IExceptionFilter و FilterAttribute برای ایجاد فیلتر سفارشی استفاده می کنیم.
به همان شیوه یک رابط کاربری IAuthorizatinFilter و FilterAttribute را برای ایجاد فیلتر سفارشی اجرا کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyErrorHandler : FilterAttribute, IExceptionFilter { public override void IExceptionFilter.OnException(ExceptionContext filterContext) { Log(filterContext.Exception); base.OnException(filterContext); } private void Log(Exception exception) { //log exception here.. } } |
به علاوه، شما همچنین می توانید یک کلاس فیلتر داخلی را ایجاد کرده و یک متد مناسب برای گسترش قابلیت فیلترهای داخلی را لغو کنید.
در مثال زیر یک فیلتر سفارشی ایجاد خواهیم کرد تا هر استثنای غیر قابل تغییر را با کلاس HandleError و متد OnException وارد کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MyErrorHandler : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { Log(filterContext.Exception); base.OnException(filterContext); } private void Log(Exception exception) { //log exception here.. } } |
حالا می توانید ویژگی MyErrorHandler را به سطح عمومی یا کنترلر یا سطح متد اجرایی اعمال کنید، با این روشها ما ویژگی HandleError را اعمال می کنیم.
مثال- اعمال فیلتر سفارشی به کنترلر:
1 2 3 4 5 6 7 8 9 | [MyErrorHandler] public class HomeController : Controller { public ActionResult Index() { return View(); } } |
نکات زیر را به خاطر بسپارید:
۱- فیلترهای MVC برای اجرای بخش هایی قبل یا بعد از اجرای متد اجرایی بکار می رود.
۲- انواع فیلترهای MVC :
۳- فیلترها می توانند بصورت عمومی در کلاس FilterConfig ، سطح کنترلر یا متد اجرایی اعمال کرد.
۴- کلاس فیلترهای سفارشی را می توان با پیاده سازی کلاس FilterAttribute و رابط کاربری متناظر اعمال کید.
مباحث فوق نمونه هایی از کاربردهای فیلترها در ASP.NET MVC را به شما نشان می دهد. با استفاده از این فیلترها می توانید کدهایی را قبل یا بعد از اجرای متدهای اجرایی برنامه، اجرا کنید. در بخش بعدی ما به آموزش فیلترهای اجرایی در ASP.NET MVC می پردازیم.