What's the difference between implementing FilterAttribute, IActionFilter and inheriting from ActionFilterAttribute in asp.net mvc 3?

Aleksei Chepovoi picture Aleksei Chepovoi · Feb 14, 2013 · Viewed 13.1k times · Source

I see that in one situation we can override OnActionExecuting or OnActionExecuted methods inheriting from ActionFilterAttribute class like this:

public class MyFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    { // bla bla }
}

And in other situation we also can implement IActionFilter and FilterAttribute like this:

public class MySecondFilterAttribute : FilterAttribute, IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutingContext filterContext) {}
}

So, is there any differences between these two approaches, maybe any particular situations where it would be preferable to use one of them over the other??

Thanks in advance.

Answer

wnascimento picture wnascimento · Feb 14, 2013

Basically FilterAttribute provides the most low level behaviour of MVC Attributes and implements the IMvcFilter that provides the Order and AllowMultiple properties.

ActionFilterAttribute is the basis for filtering actions and results, since is a implementation of IActionFilter, IResultFilter and inherit from FilterAttribute.

Your MySecondFilterAttribute implementation leads to ActionFilterAttribute without IResultFilter capabilities (OnResultExecuting and OnResultExecuted).