为什么从OnActionExecuting内部调用OnActionExecuting?

时间:2019-06-06 17:11:55

标签: asp.net-mvc

以下代码是从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();
            }
}

1 个答案:

答案 0 :(得分: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中的代码的示例是否会发生,但是它是一种很好的最佳实践在其他类似情况下也是如此。