在 ASP.NET MVC 中的控制器操作之后调用方法

Ami*_*eri 3 asp.net asp.net-mvc

我曾经认为,在所有控制器方法结束后,将调用以下方法:

protected override void EndExecute(IAsyncResult asyncResult)
Run Code Online (Sandbox Code Playgroud)

现在调用所有重写方法,然后调用控制器方法。您知道在所有方法之后调用哪个重写方法吗?

小智 5

您可以使用操作过滤器,每次执行任何方法时都会调用它。您可以通过匹配方法名称来过滤它。

 public class LogActionFilter : ActionFilterAttribute
 {
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
           Log("OnActionExecuting", filterContext.RouteData);       
      }

      public override void OnActionExecuted(ActionExecutedContext filterContext)
      {
           Log("OnActionExecuted", filterContext.RouteData);       
      }

      public override void OnResultExecuting(ResultExecutingContext filterContext)
      {
           Log("OnResultExecuting", filterContext.RouteData);       
      }

      public override void OnResultExecuted(ResultExecutedContext filterContext)
      {
           Log("OnResultExecuted", filterContext.RouteData);       
      }


      private void Log(string methodName, RouteData routeData)
      {
           var controllerName = routeData.Values["controller"];
           var actionName = routeData.Values["action"];
           var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
           Debug.WriteLine(message, "Action Filter Log");
      }

 }
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请访问:https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs