笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)

概念介绍

动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行。

如果我们需要创建动作过滤器需要实现IActionFilter接口。

namespace System.Web.Mvc
{
    //
    // 摘要:
    //     定义操作筛选器中使用的方法。
    public interface IActionFilter
    {
        //
        // 摘要:
        //     在执行操作方法后调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        void OnActionExecuted(ActionExecutedContext filterContext);
        //
        // 摘要:
        //     在执行操作方法之前调用。
        //
        // 参数:
        //   filterContext:
        //     筛选器上下文。
        void OnActionExecuting(ActionExecutingContext filterContext);
    }
}

我们看到该接口里有两个方法OnActionExecutingOnActionExecuted,前者在动作方法执行前调用,后者在动作方法执行后调用。

OnActionExecuting方法

我们已经知道了OnActionExecuting方法实在动作方法调用之前被,调用的那么我们就可以利用这个方法来检测请求,并且可以在这里修改请求,取消请求,在OnActionExecuting方法中传递的参数是一个ActionExecutingContext对象,它继承于ControllerContext类,它的属性如下:

名称 类型 说明
ActionDescriptor ActionDescriptor 获取或设置操作描述符。
ActionParameters IDictionary<string, object> 获取或设置操作方法参数。
Result ActionResult 获取或设置由操作方法返回的结果。

执行OnActionExecuting方法

下面我将演示OnActionExecuting方法,首先我们还是在之前的Filter文件夹下添加一个名为 CustomActionAttribute.cs 的过滤器类,我们继承 FilterAttribute 类和 IActionFilter 接口,为了方便演示,我们简单处理,判断请求类型,如果是GET请求那么我们让其抛出404错误。

这是我们在 CustomActionAttribute.cs 文件中编写的代码

public class CustomActionAttribute : FilterAttribute, IActionFilter
    {

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "get", StringComparison.CurrentCultureIgnoreCase))
            {
                filterContext.Result = new HttpNotFoundResult();
            }
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }

    }

因为创建动作过滤器需要实现IActionFilter接口中的两个方法,如果不需要实现逻辑我们可以先让其空着,因为MVC框架对动作过滤器中的两个方法都会调用。

接着我们在Home控制器里添加一个方法方法会直接在页面输出“执行方法”这几个字,接着我们在方法上应用,我们的动作过滤器

        [CustomAction]
        public ActionResult GetText()
        {
            ViewBag.Message = "执行方法";

            return View();
        }

好了我们允许程序,并且在浏览器里直接请求我们这个方法,我们看看效果

OnActionExecuted方法

OnActionExecuted方法在动作方法执行后调用,传递给OnActionExecuted方法的参数是ActionExecutedContext对象。这个类相比我们之前的ActionExecutingContext对象而言多了些属性,它的属性如下:

名称 类型 说明
ActionDescriptor ActionDescriptor 获取或设置操作描述符。
Canceled bool 获取或设置一个值,该值指示此ActionExecutedContext 对象已被取消。
Exception Exception 获取或设置在操作方法的执行过程中发生的异常(如果有)。
ExceptionHandled bool 获取或设置一个值,该值指示是否处理异常。
Result ActionResult 获取或设置由操作方法返回的结果。

执行OnActionExecuted方法

我们可以通过OnActionExecuted方法来执行一些跨越动作方法的任务,比如我们可以用它来获取动作方法执行的时间。我们修改 CustomActionAttribute.cs 过滤器代码如下:

public class CustomActionAttribute : FilterAttribute, IActionFilter
    {
        private Stopwatch timer;

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
 
            timer = Stopwatch.StartNew();
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            timer.Stop();
            if (filterContext.Exception == null)
            {
                filterContext.HttpContext.Response.Write($"<div>方法执行时间:{timer.Elapsed.TotalSeconds:F6}s</div>");
            }
        }

    }

我们在方法启动之前启动了一个计时器并在方法执行后停止了它,并且将这个时间间隔输出到我们的页面上。

posted @ 2017-10-16 09:06  东城慕水  阅读(1440)  评论(1编辑  收藏  举报