笨鸟先飞之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();
}

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

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

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

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

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

上一篇:Linux Oracle删除归档日志


下一篇:HTML5移动开发学习笔记之CSS3基础学习