您的位置:首页 > 编程语言 > ASP

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

2017-10-16 09:06 519 查看

概念介绍

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

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

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

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

OnActionExecuting方法

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

名称类型说明
ActionDescriptorActionDescriptor获取或设置操作描述符。
ActionParametersIDictionary获取或设置操作方法参数。
ResultActionResult获取或设置由操作方法返回的结果。

执行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对象而言多了些属性,它的属性如下:

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

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

}

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: