آشنایی با فیلترها در MVC

سه شنبه 24 مرداد 1396

در MVC در خواست کاربر به کنترلر و اکشن مناسب هدایت میشود.ما نیاز به وضعیتی داریم که شما بتوانید بعضی از منطق ها را قبل و بعد از یک اکشن متد اجرا کنید. Mvc فیلترها را برای این کار ارائه داده است.در این مقاله ما قصد داریم که فیلترها را در mvc بررسی کنیم.

آشنایی با فیلترها در MVC

فیلترهای ASP.NET MVC در واقع یک کلاس سفارشی هستند که شما میتوانید منطقی را که نیاز است در قبل یا بعد از آن اجرا شود را بنوسید.

در MVC عمدتا 4 نوع فیلتر وجود دارد:

فیلترهای تأیید(Authorization)

فیلترهای اکشن(Action )

فیلترهای نتیجه(Result )

فیلترهای خطاها(Exception )

برای پیاده سازی فیلترهای سفارشی که در بالا آن ها را بیان کردیم ما میتوانیم اینترفیس فیلتر مورد نظر را پیاده سازی کنیم.

به ما اجازه دهید که به توضیح تک به تک فیلترها و نحوه پیاده سازی هر یک از فیلترهای سفارشی بپردازیم.

فیلترهای تایید (Authorization )

کار این فیلتر کنترل کردن منطق تایید (authorization ) و احراز هویت (authentication )  است.این منطق قبل از اجرا شدن اکشن اجرا می شود.

ما مجوز (authorization ) یک اکشن را فقط با معین کردن آن اکشن به صفت authorize همانطور که در زیر مشاهده میکنید پیاده سازی میکنیم.

[Authorize]    
public ActionResult Index()    
{    
    return View();    
}  

اکنون ، به ما اجازه دهید نحوه سفارشی کردن فیلتر authorization  برای برنامه خودمان را  بیاموزیم.

برای پیاده سازی authorization سفارشی ، ما باید کلاس authorizeAttribute  را  به صورت کلاس سفارشی خودمان که در زیر مشاهده میکنید ، توسعه بدهیم.

حال ما authorizeCore  را دوباره نویسی (override) میکنیم و سپس به پیاده سازی منطقی که مشخص میکند که کاربر مجاز است یا نه میپردازیم.

 در نمونه کد زیر ، ما کلاس Authorization  خود را با استفاده از صفت Authorize  توسعه میدهیم و احراز هویت (authentication ) را مانند زیر پیاده سازی میکنیم.

اگر کاربر تأیید نشده باشد ، مقدار false را که در خط 15 مشاهده میکنید باز میگرداند و اجازه اجرا شدن اکشن را نمیدهد.

در خط 22 ، ما تعیین می کنیم که آیا کاربر وارد شده برای فراخوانی اکشن مجاز است.

اگر مقدار false بازگردانده شد ، این از اجرای اکشن جلوگیری میکند.

namespace Application.Filters    
{    
    public class CustomAuthorize:AuthorizeAttribute    
    {    
        ISecurityRepos securityRepos;    
        public CustomAuthorize()    
        {    
            securityRepos = new ISecurityRepos();    
        }    
        protected override bool AuthorizeCore(HttpContextBase httpContext)    
        {    
            IPrincipal user = httpContext.User;    
            if (!user.Identity.IsAuthenticated)    
            {    
                return false;    
            }    
            string action, controller;    
            MvcHandler mvc = httpContext.CurrentHandler as MvcHandler;    
            action = mvc.RequestContext.RouteData.Values["action"].ToString();    
            controller = mvc.RequestContext.RouteData.Values["controller"].ToString();    
            string path = string.Format("{0}/{1}", controller, action);    
            bool isAuthorized = securityRepos.IsAuthorized(path,user.Identity.Name);    
            return isAuthorized ;    
        }    
    }    
}  

از آنجاییکه ما منطق را برای authorization سفارشی خود تعریف کردیم ، برای استفاده از آن و پیاده سازی authorization فقط کافی است که اکشن را به صفت CustomAuthorize تعیین کنیم.

[CustomAuthorize]      
public ActionResult Index()      
{      
    return View();      
}   

حالا ، ما نحوه پیاده سازی AuthorizeCore را یادگرفتیم ، اجازه دهید ببینیم که چگونه میتوانیم درخواست های HandleUnauthorized  را پیاده سازی کنیم.هر زمان که متد authorizeCore  مقدار false رابرگرداند متد HandleUnauthorizedRequest فراخوانی میشود که ما میتوانیم منطق را برای کنترل کردن در خواست های unauthorized  همانند زیر پیاده سازی کنیم.

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)    
{    
           filterContext.Controller.ViewData["AuthorizationError"] = "You are not authorized for this action";    
}  

اکشن فیلترها

اینها اینترفیس IActionFilter را که شامل متدهای onActionExecuting  و OnActionExecuted  است را پیاده سازی میکنند.متد OnActionExecuting قبل از اجرای متد اجرا می شود.ما از اکشن فیلتر برای لاگ زدن فراخوانی اکشن ها استفاده میکنیم.ما همچنین میتوانیم هر خطایی هنگام اجرای اکشن رخ می دهد را چک کنیم و جزئیات خطا را در دیتابیس لاگ بزنیم.

public class LoggingFilterAttribute : ActionFilterAttribute    
{    
    public override void OnActionExecuting(ActionExecutingContext filterContext)    
    {    
        filterContext.HttpContext.Trace.Write("(Logging Filter)Action Executing: " +    
            filterContext.ActionDescriptor.ActionName);    
    
        base.OnActionExecuting(filterContext);    
    }    
    
    public override void OnActionExecuted(ActionExecutedContext filterContext)    
    {    
        if (filterContext.Exception != null)    
            filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");    
    
        base.OnActionExecuted(filterContext);    
    }    
}  

Result فیلترها

این اینترفیس IResultFilter را پیاده سازی میکند.که این اینترفیس اساسا دو متد اصلی به نام های OnResultExecuting و OnResultExecuted دارد.متد OnResultExecuting قبل از اینکه ActionResult  اجرا شود، اجرا می شود و متد OnResultExecuted  بعد از نتیجه (result) اجرا میشود.

public override void OnResultExecuted(ResultExecutedContext filterContext)    
  {    
      Log("OnResultExecuted", filterContext.RouteData);          
  }    
    
  public override void OnResultExecuting(ResultExecutingContext filterContext)    
  {    
      Log("OnResultExecuting ", filterContext.RouteData);          
  } 

همانند اکشن فیلترها ، ما میتوانیم از result فیلترها برای لاگ زدن قدم ها استفاده کنیم.

در استفاده real time ، ما میتوانیم از Result فیلتر ها برای لاگ زدن خطاهایی که در  زمان  اجرا شدن یک View بوجود می آیند ، استفاده کنیم.

Exception فیلترها

برای پیاده سازی این فیلتر باید اینترفیس IExceptionFilter را پیاده سازی کرد و این فیلتر زمانی اجرا میشود که یک خطای کنترل نشده در زمان اجرای کد بوجود آید.

Exception  فیلترها میتوانند برای استفاده از task ها ، همانند لاگ زدن و نمایش خطاهای صفحه ، مفید باشند.

ما میتوانیم اینترفیس IExceptionFilter را با استفاده از متد OnException و پیاده سازی کردن منطق سفارشی خودمان در داخل متد OnException همانند کدی که در زیر قرار داده ایم ، پیاده سازی کنیم:

namespace Application.Filters    
{    
    public class CustomException:FilterAttribute,IExceptionFilter    
    {    
        public void OnException(ExceptionContext filterContext)    
        {    
            if (!filterContext.ExceptionHandled && filterContext.Exception is NullReferenceException)    
            {    
                filterContext.Result = new RedirectResult("ErrorPage.html");    
                filterContext.ExceptionHandled = true;    
            }    
        }    
    
            
    }    
}  

همانطور که در کد بالا مشاهده میکنید ، ما می توانیم هر بار که یک خطا کنترل نشده را دریافت می کنیم، به یک صفحه خطای سفارشی هدایت کنیم.

آموزش asp.net mvc

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید