Sunday, March 10, 2013

How to 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 ?

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


Authorization FilterWhat 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(AuthorizationContext filterContext)
      {
          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!";

            return View();
        }
    }
}

Action Filter
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(ActionExecutingContext filterContext)
        {
            //The action filter logic - before
        }

        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            //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!";

            return View();
        }
    }
}

Result FilterWhat 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(ResultExecutingContext filterContext)
        {
            //The action filter logic - before
        }

        public void OnResultExecuted(ResultExecutedContext filterContext)
        {
            //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!";

            return View();
        }
    }
}


Exception FilterWhat 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(ExceptionContext filterContext)
        {
            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!";

            return View();
        }
    }
}


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 :

Complete project


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!";

            return View();
        }
    }
}

That's It.You're Done. 

Do you need to Download this Sample Project ?


Download

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.

If you feel it was a good article,Give me a +1.Thank You.




Happy Coding.


You Might Also Like

How to Improve ASP.Net MVC 3 View Performance ?
How to Use ViewModel with ASP.NET MVC ?
How to use Asp.Net MVC TempData Properly ?

12 comments:

  1. Thanks for sharing Sampath.
    An interesting article.

    ReplyDelete
    Replies
    1. Hi Dasun,

      Thanks, I’m glad you enjoyed it!
      Keep in Touch.

      Delete
  2. Action Filter in two main methods in mvc infrastructure work
    OnResultExecuting: occurs when one is being built as a result of the information being made then you can Sath response to control or manipulate you.

    -omid ghorbani-

    ReplyDelete
    Replies
    1. Hi omid,

      Thanks for additional Information.
      Keep in Touch.

      Delete
  3. Replies
    1. Hi Naresh,

      You're warmly welcome.
      Keep in Touch.

      Delete
  4. This is best article i have seen on MVC filters

    ReplyDelete
    Replies
    1. Hi Rakesh,

      Thanks, I’m glad you enjoyed it ! :)

      Delete
  5. Really nice artical.. easy to understand .
    Give some example how to execute filters after creating object and before creating objects.. Thanks

    ReplyDelete
  6. Dear Sampath,

    You have saved me. This article is helped me a lot. I went lot of website and not understood. But this one is very easy and clear.
    Thanks for posting this one.
    Grate one.....

    ReplyDelete
    Replies
    1. Hi Mahesh,

      Thanks.Glad to hear that it helped. :)

      Delete

Thanks for your Feedback.