【问题标题】:Why is OnActionExecuting called from within OnActionExecuting?为什么从 OnActionExecuting 中调用 OnActionExecuting?
【发布时间】:2019-06-06 17:11:55
【问题描述】:

下面的代码是从this post 复制而来的。我在其他帖子中看到同样的事情,例如在这个this post 的答案中。

为什么base.OnActionExecuting(filterContext); 行包含在整个OnActionExecuting 方法中?

它实现什么目的?

public class HomeController : Controller
    {
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                // do some irrelevant stuff
                base.OnActionExecuting(filterContext);           
            }

    public ActionResult Index()
            {            
                return View();
            }
}

【问题讨论】:

  • 我认为这个问题可能和你的一样,或者至少有一个可以帮助的答案:stackoverflow.com/questions/6399851/…
  • 在此处添加一些详细信息是指向Controller.cs 类的链接,base.OnActionExecution(filterContext) 正在调用该类。这是一个空的虚拟方法,因此在您的情况下,它实际上 current 无论您是否调用它都不会产生影响。但是,假设将来您升级 .NET 版本并且升级包含 Controller.OnActionExecuting 方法中的一些代码,那么新代码将不会被调用,并且很可能会中断。 TLDR;即使它现在什么都不做,我仍然会调用它。 github.com/aspnet/AspNetWebStack/blob/master/src/System.Web.Mvc/…
  • 作为扩展的旁注,.NET Core 目前正在开发中,框架处于维护模式,所以我非常怀疑任何新的 .NET 框架版本都会发布,并且怀疑您是否会遇到特定的上面提到的用例。但这在其他类似情况下也是一种很好的做法
  • @GregH 我想我明白了。我仍在学习如何更深入地研究提供的框架;有时现有代码的数量是压倒性的。似乎您在说该框架可能具有对 OnActionExecution 重要的代码,但它目前没有,因此没有任何反应,但是如果添加了新代码,如果没有该行,我会错过它并且可能会导致中断。新的框架代码是否也可能导致中断?您的评论比上面第一条评论中引用的帖子更好地解释了它,尽管这是一个很好的参考。也许你应该把它写在这里作为答案。
  • @Alan 你的理解是正确的。此外,确保新框架代码可能会导致某些东西中断是合理的,但是这种情况通常比您不调用 base.OnActionExecuting 并且出现问题更容易发现和修复。

标签: asp.net-mvc


【解决方案1】:

简答:

目前,base.OnActionExecuting(filterContext) 行不执行任何操作(不执行任何操作)。不管有没有这条线,功能行为都是​​一样的。

更长的答案:

Controller.OnActionExecuting 的 .NET 源代码如下所示(取自 here):

protected virtual void OnActionExecuting(ActionExecutingContext filterContext)
{
}

如果您查看OnActionExecuting 方法,您会发现该方法完全是空的。这是base.OnActionExecuting(filterContext) 正在调用的代码/方法。您没有必须致电base.OnActionExecuting(filterContext),因为它目前什么都不做,但我建议您这样做。这背后的原因是,如果更新了 .NET 框架,使得 Controller.OnActionExecuting 方法实际上需要其中的代码,那么在不包含相关行的情况下将不会调用所需的代码。这可能会导致一些调试非常困难和耗时的场景。当然也有可能引入新的框架代码,当您调用base.OnActionExecuting 时会破坏您的代码,但是这种情况通常比其他情况更容易发现和修复。当然,最终,这一切都将归结为框架引入了哪些代码,以及它破坏了哪些代码,识别和解决的难易程度。

附带说明,.NET 框架现在处于维护模式,所以我非常怀疑我上面提到的 .NET 框架更新Controller.OnActionExecuting 中的代码的示例是否会发生,但它在其他方面是一个很好的最佳实践类似的场景也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多