views:

23

answers:

1

All my controllers inherit from a BaseController that has an ActionFilter attribute:

[AnalyticsData]
public class BaseController : Controller {}

public class AccountController : BaseController {}

Some of my Actions in my controllers reuse the AnalyticsData ActionFilter:

public class AccountController : BaseController
{
    [AnalyticsData(Page="AccountProfile")]
    public ActionResult Profile()
    {
        // return View
    }
}

I notice that the AnalyticsData ActionFilter only runs once. This is a good thing and I only want it to run once, but I'm wondering how that happens. If I set my breakpoint inside the OnActionExecuting:

public class AnalyticsAttribute : ActionFilterAttribute 
{
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // break point set here
        }
}

...it only gets hit once when AccountController serves it Profile view.

How do ActionFilters and/or Attributes work that [AnalyticsData(Page="AccountProfile")] on the Action overrides/replaces [AnalyticsData] on BaseController?

+1  A: 

The short answer is that the ASP.NET MVC framework code that retrievs the list of filters for each action removes duplicates (action filters of the same type) in such a way that it prefers actionfilters defined on the action method over ones defined on the controller (or its base class). In MVC 2 this logic is performed in a few internal methods in the ActionDescriptor class

marcind