【问题标题】:ExecuteCore() vs OnActionExecuting(ActionExecutingContext filterContext)?ExecuteCore()与 OnActionExecuting(ActionExecutingContext filterContext)?
【发布时间】:2010-12-14 15:13:22
【问题描述】:

只是好奇,它们听起来很相似。 ExecuteCore() 与 OnActionExecuting(ActionExecutingContext filterContext) 有什么区别?

在什么情况下一种比另一种更有用?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    实际上,它们只是 MVC 执行管道中的不同点。

    1. ExecuteCore 由 控制器本身之后的 MvcHandler 被实例化。到了这个时候 MVC 甚至不知道如何 控制器将调用其操作。 您可以覆盖标准 控制器的 ExecuteCore 进行调整 其整体执行过程a 一点点。

    2. OnActionExecuting 是一个完全 不同的故事。它被称为期间 动作过滤调用 控制器动作调用者。就这样 点 MVC 已经知道该动作 存在,调用它,获得所有 过滤器(通常定义为 属性)并在一个 给定的整体执行时刻 管道(OnActionExecuting, OnActionExecuted, OnResultExecuting 等等)。

    这取决于您在决定使用什么扩展点时究竟想要实现什么。

    • 在派生中覆盖 ExecuteCore 控制器来调整它的共同点 行为(并非经常如此 在普通应用程序中)。
    • 使用过滤器 执行一些额外的任务 似乎与什么行动本身正交 应该做的(通常这是一些 类似 AOP 的逻辑或与数据库会话/事务管理有关)。

    【讨论】:

      【解决方案2】:

      ExecuteCore 在控制器初始化后立即调用,而OnActionExecuting 发生在执行管道的后期,并在调用控制器操作之前立即调用。在第二种方法中,您可以直接操作动作结果并通过重定向到其他动作来缩短动作的执行:

      filterContext.Result = ...
      

      【讨论】:

      • 每种方法适合什么样的场景?我看到了一个本地化的例子,它使用 ExecuteCore 来获取语言/文化设置。我已经使用 OnActionExecuting 添加了一些所有操作都使用的通用视图数据......只是好奇。谢谢!
      猜你喜欢
      • 2012-10-25
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多