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
- 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
}
}
}
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();
}
}
}
- 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();
}
}
}
- 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();
}
}
}
- 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