You are here:Home » Twitter » Create a Custom Action Filter for MVC 3

Create a Custom Action Filter for MVC 3

Create a Custom Action Filter for MVC 3

What is an Action Filter ?
  • It's an Attribute
  • Could be applied on a particular Action
  • Could be applied on a Controller
  • It modifies the way Action Executes
  • An Action Filter is a class that inherits from the FilterAttribute base class
  • Filters are used to inject an extra logic into the MVC request processing
  • Filters to define logic which is used to apply add-on functionality to the application
  • e.g. defining Authorization, Caching, Logging, Exception etc.

What are the Types of Action Filters ?




















What is 1-2-3-4 ?
  • If an Action Method has more than One Action Filter applied,
  • Then the order in which they are executed
  • i.e. Action Filters are Executed in the order 1-2-3-4 
  • Firstly Executes Authorization Filters
  • Lastly Executes Exception Filters

What is an Authorization Filter ?
  • These filters are always run first before any other filters
  • They implement IAuthorizationFilter interface
  • Provides AuthorizeAttribute as the default class implementation
How to Do That ?
MyAuthorizationFilterAttribute.cs

using System.Web.Mvc;

namespace CustomActionFilter.CustomActionFilters
 {
 public class MyAuthorizationFilterAttribute:FilterAttribute,IAuthorizationFilter
  {
      public void OnAuthorization(AuthorizationContextfilterContext)
      {
          if(filterContext.HttpContext.Request.IsAuthenticated)
          {
              //The action filter logic
          }
      }
  }
}

HomeController.cs
using System.Web.Mvc;
using CustomActionFilter.CustomActionFilters;
namespace CustomActionFilter.Controllers
{
    public class HomeController: Controller
    {
        [MyAuthorizationFilter]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            returnView();
        }
    }
}


What is an Action Filter ?
  • It Implements IActionFilter interface
  • It Executes before and after action result is executed
  • Provides ActionFilterAttribute as the default class implementation

How to Do That ?

MyActionFilterAttribute.cs

using System.Web.Mvc;
namespace CustomActionFilter.CustomActionFilters
{
    public class MyActionFilterAttribute: FilterAttribute, IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContextfilterContext)
        {
            //The action filter logic - before
        }
        public void OnActionExecuted(ActionExecutedContextfilterContext)
        {
            //The action filter logic - after
        }
    }
}
HomeController.cs

using System.Web.Mvc;
using CustomActionFilter.CustomActionFilters;
namespace CustomActionFilter.Controllers
{
    public class HomeController: Controller
    {
        [MyActionFilter]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            returnView();
        }
    }
}
What is a Result Filter ?
  • It Implements IResultFilter interface
  • It Executes before and after action result is executed

How to Do That ?
MyResultFilterAttribute.cs

using System.Web.Mvc;
namespace CustomActionFilter.CustomActionFilters
{
    public class MyResultFilterAttribute: FilterAttribute, IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContextfilterContext)
        {
            //The action filter logic - before
        }
        public void OnResultExecuted(ResultExecutedContextfilterContext)
        {
            //The action filter logic - after
        }
    }
}
HomeController.cs
using System.Web.Mvc;
using CustomActionFilter.CustomActionFilters;
namespace CustomActionFilter.Controllers
{
    public class HomeController: Controller
    {
        [MyResultFilter]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            returnView();
        }
    }
}

What is an Exception Filter ?
  • It Implements IExceptionFilter interface
  • It Executes only if exception is thrown by action method or an action result
  • Provides HandleErrorAttribute as the default class implementation

How to Do That ?
MyExceptionFilterAttribute.cs

using System.Web.Mvc;
namespace CustomActionFilter.CustomActionFilters
{
    public class MyExceptionFilterAttribute: FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContextfilterContext)
        {
            if(filterContext.Exception != null)
            {
                //The action filter logic
            }
        }
    }
}
HomeController.cs
using System.Web.Mvc;
using CustomActionFilter.CustomActionFilters;
namespace CustomActionFilter.Controllers
{
    public class HomeController: Controller
    {
        [MyExceptionFilter]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            returnView();
        }
    }
}
Note :

  • I have used VS 2010 with Asp.Net MVC 3 and C# for develop above code samples.

CustomActionFilter's Project Tree is as below :
Finally, the HomeController with All the Custom Action Filters are as below :
using System.Web.Mvc;
using CustomActionFilter.CustomActionFilters;
namespace CustomActionFilter.Controllers
{
    public class HomeController: Controller
    {
        [MyAuthorizationFilter]
        [MyActionFilter]
        [MyResultFilter]
        [MyExceptionFilter]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            returnView();
        }
    }
}
That's It.You're Done. 

Do you need to Download this Sample Project ?


Conclusion
  • Action Filters allow you to do some extra pre or post processing to be carried out,in addition to the code written in the action methods
  • Depending on your need you can implement IAuthorizationFilter, IActionFilter, IResultFilter or IExceptionFilter interfaces to make your filter an Authorization filter, Action filter, Result filter or Exception filter respectively
  • These interfaces decide the order in which the action filters are executed
  • Which makes your application more flexible and maintainable


I hope this helps to You.Comments and feedback greatly appreciated.

0 comments:

Post a Comment