zoukankan      html  css  js  c++  java
  • 笨鸟先飞之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>");
                }
            }
    
        }
    

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

  • 相关阅读:
    Android第三次作业
    Android第二次作业
    2016-2017-2软件工程课程总结
    软件工程——个人总结
    软件工程——团队答辩
    软件工程——团队作业4
    软件工程——团队作业3
    软件工程——团队作业2
    软件工程——团队作业1
    软件工程第二次作业——结对编程
  • 原文地址:https://www.cnblogs.com/chen-jie/p/APS-NET-MVC-ActionFilter.html
Copyright © 2011-2022 走看看