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>");
                }
            }
    
        }
    

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

  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    链式表的按序号查找
    可持久化线段树——区间更新hdu4348
    主席树——树链上第k大spoj COT
  • 原文地址:https://www.cnblogs.com/chen-jie/p/APS-NET-MVC-ActionFilter.html
Copyright © 2011-2022 走看看