笨鸟先飞之ASP.NET MVC系列之过滤器(05结果过滤器)
2017-10-20 09:08
501 查看
概念介绍
结果过滤器看名字就知道这个过滤器是针对方法所产生结果的,结果过滤器,主要在我们的动作方法结果返回前后执行。如果我们需要创建结果过滤器需要实现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>"); } }
我们来看看结果
相关文章推荐
- 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(04认证过滤器)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(06异常过滤器)
- 笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)
- ASP.NET MVC ApiController过滤器处理返回结果
- [翻译]ASP.NET MVC 3 开发的20个秘诀(二十)[20 Recipes for Programming MVC 3]:缓存结果数据加速页面载入
- Asp.Net MVC2 实用入门系列:第七篇:闲话ASP.NET MVC
- 介绍一个ASP.net MVC 系列教程
- ASP.NET MVC系列:从Controller访问Model数据
- Asp.Net MVC<五>:过滤器
- 返璞归真 asp.net mvc 系列文章索引
- (转)一步一步Asp.Net MVC系列_权限管理设计起始篇
- asp.net MVC学习系列-前后台数据校验
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
- 【.NET特供-第三季】ASP.NET MVC系列:MVC与三层图形对照
- ASP.NET MVC 过滤器Filter
- [知识库分享系列] 四、ASP.NET MVC and Winform
- 使用StructureMap扩展ASP.NET MVC三层结构框架系列文章总结篇(附源码下载)
- ASP.NET MVC系列:Area