ASP.NET ActionFilters 和继承

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

我的所有 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/

相关文章:

html - asp.net 调用 "target"伪 css 类

c# - #在网络发布期间定义符号

python - 为什么在处理函数和类中的未绑定(bind)局部变量时存在差异?

javascript - 使用 emberjs,如何从父 View 扩展 attributeBindings 参数?

c# - 如何从文本框获取值

用于生成表行的 JavaScript

asp.net - 关闭 Chrome 时停止 Visual Studio 调试器

c# - 在 MVC 中使用配置文件

asp.net - <asp :PlaceHolder> alternate in mvc Razor page?

javascript - 如何使用 ReactJS 和 Typescript 定义组件实例属性? `Property ' var' 在类型 'App' ` 上不存在