概念介绍
结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行。
如果我们需要创建结果过滤器需要实现IResultFilter接口。
namespace System.Web.Mvc
{
//
// 摘要:
// 定义结果筛选器所需的方法。
public interface IResultFilter
{
//
// 摘要:
// 在操作结果执行后调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnResultExecuted(ResultExecutedContext filterContext);
//
// 摘要:
// 在操作结果执行之前调用。
//
// 参数:
// filterContext:
// 筛选器上下文。
void OnResultExecuting(ResultExecutingContext filterContext);
}
}
我们看到该接口里有两个方法OnResultExecuting和OnResultExecuted,前者在动作方法结果返回前调用,后者在动作方法结果返回后调用。
OnResultExecuting
我们已经知道了OnResultExecuting
方法是在动作方法结果返回之前被调用的那么我们就可以利用这个方法在这里对请求的内容追加,修改,取消,在OnResultExecuting
方法中传递的参数是一个ResultExecutingContext
对象,它继承于ControllerContext类,它的属性如下:
名称 | 类型 | 说明 |
---|---|---|
Cancel | bool | 获取或设置一个值,该值指示此 ResultExecutingContext 值是否为“cancel”。 |
Result | ActionResult | 获取或设置操作结果。 |
执行OnActionExecuting方法
下面我将演示OnActionExecuting方法,首先我们还是在之前的Filter文件夹下添加一个名为 CustomResultAttribute.cs 的过滤器类,我们继承 FilterAttribute 类和 IResultFilter 接口,为了方便演示,我们简单处理,直接在返回结果输出到视图前追加一段文字
这是我们在_CustomResultAttribute.cs_ 文件中编写的代码
public class CustomResultAttribute : FilterAttribute, IResultFilter
{
public void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>返回前输出</div>");
}
public void OnResultExecuted(ResultExecutedContext filterContext)
{
}
}
接着我们调用之前的方法把动作过滤器替换成我们的结果过滤器
[CustomResult]
public ActionResult GetText()
{
ViewBag.Message = "执行方法";
return View();
}
好了我们运行程序,并且在浏览器里直接请求我们这个方法,我们看看效果
OnResultExecuted方法
OnResultExecuted
方法在动作方法执行后调用,传递给OnResultExecuted
方法的参数是ResultExecutedContext对象。它的属性如下:
名称 | 类型 | 说明 |
---|---|---|
Canceled | bool | 获取或设置一个值,该值指示此ResultExecutedContext 对象已被取消。 |
Exception | Exception | 获取或设置在操作方法的执行过程中发生的异常(如果有)。 |
ExceptionHandled | bool | 获取或设置一个值,该值指示是否处理异常。 |
Result | ActionResult | 获取或设置由操作方法返回的结果。 |
执行OnActionExecuted方法
同样的我们可以像之前动作过滤器一样可以通过获取动作方法结果返回的时间。我们修改 CustomResultAttribute.cs 过滤器代码如下:
public class CustomResultAttribute : FilterAttribute, IResultFilter
{
private Stopwatch timer;
public void OnResultExecuting(ResultExecutingContext filterContext)
{
timer = Stopwatch.StartNew();
}
public void OnResultExecuted(ResultExecutedContext filterContext)
{
timer.Stop();
filterContext.HttpContext.Response.Write($"<div>方法结果结束时间为:{timer.Elapsed.TotalSeconds:F6}</div>");
}
}
我们在方法启动之前启动了一个计时器并在结果返回后停止了它,并且将这个时间间隔输出到我们的页面上。
结合动作过滤器和结果过滤器
MVC里自带了一个过滤器叫做ActionFilter
这个过滤器就是创建动作过滤器和结合过滤器,为了演示这个过滤器的使用我们创建一个名为ActionProcessFilterAttribute
的新过滤器,我们结合两种过滤器,并把每个过滤产生的步骤输出到页面上。过滤器代码如下:
public class ActionProcessFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>方法调用前</div>");
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>方法调用后</div>");
}
public void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>结果返回前</div>");
}
public void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("<div>结果返回后</div>");
}
}
我们来看看结果