我的所有 Controller 都继承自具有 ActionFilter 属性的 BaseController:
[AnalyticsData]
public class BaseController : Controller {}
public class AccountController : BaseController {}
我的 Controller 中的一些操作重用了 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 为其配置文件 View 提供服务时,它只会被命中一次。
ActionFilters 和/或属性如何工作以使得 Action 上的 [AnalyticsData(Page="AccountProfile")] 覆盖/替换 BaseController 上的 [AnalyticsData]?
最佳答案
简短的回答是,检索每个操作的过滤器列表的 ASP.NET MVC 框架代码会删除重复项(相同类型的操作过滤器),其方式是它更喜欢在操作方法上定义的操作过滤器而不是定义的操作过滤器在 Controller (或其基类)上。在 MVC 2 中,此逻辑是在 ActionDescriptor 类中的一些内部方法中执行的
关于ASP.NET ActionFilters 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3268370/