ASP.NET ActionFilters和继承

时间:2010-07-16 19:50:57

标签: asp.net asp.net-mvc attributes action-filter

我的所有控制器都继承自具有ActionFilter属性的BaseController:

[AnalyticsData]
public class BaseController : Controller {}

public class AccountController : BaseController {}

我的控制器中的一些操作重用了AnalyticsData ActionFilter:

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

我注意到AnalyticsData ActionFilter只运行一次。这是一件好事,我只希望它运行一次,但我想知道这是怎么发生的。如果我在OnActionExecuting中设置断点:

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

...当AccountController为其提供个人资料视图时,它只会被点击一次。

ActionFilters和/或Attributes如何在Action上覆盖/替换[AnalyticsData]上的[AnalyticsData(Page =“AccountProfile”)]?

1 个答案:

答案 0 :(得分:3)

简短的回答是,为每个操作检索过滤器列表的ASP.NET MVC框架代码会删除重复项(相同类型的操作过滤器),使得它更喜欢在操作方法上定义的操作过滤器而不是定义的操作过滤器在控制器(或其基类)上。在MVC 2中,此逻辑在ActionDescriptor类

中的一些内部方法中执行