Asp.Net MVC学习总结之过滤器详解(3)

public class MyActionFilterAttribute : FilterAttribute, IActionFilter { public void OnActionExecuting(ActionExecutingContext filterContext) { if(filterContext.HttpContext.Request.IsLocal) { filterContext.Result = new HttpNotFoundResult(); } } public void OnActionExecuted(ActionExecutedContext filterContext) { //未做实现 } }

这个例子通过用OnActionExecuting方法检查请求是否来自本地机器,如果是,编队用户返回一个“404”未找到的响应。运行结果如下图:

Asp.Net MVC学习总结之过滤器详解

实现OnActionExecuted方法

我们也可以通过OnActionExecuted方法来执行一些跨越动作方法的任务,下面这个例子是计算动作方法运行的时间,代码如下:

public class MyActionFilterAttribute : 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( string.Format("动作方法延迟的时间: {0}", timer.Elapsed.TotalSeconds)); } } } }

我们将自定义的动作过滤器MyActionFilter应用到HomeController的Index方法上,运行结果如下:

 2.5、使用结果过滤器

结果过滤器是多用途的过滤器,他会对动作方法所产生结果进行操作,结果过滤器实现IResultFilter接口,创建自定义结果过滤器需要现IResultFilter接口,该接口代码如下所示:

Asp.Net MVC学习总结之过滤器详解

当结果过滤器运用于一个动作方法时,会在动作方法返回动作结果之前,调用OnResultExecuting方法,在返回动作结果之后,会调用OnResultExecuted方法。下面这个例子是计算动作方法返回结果运行的时间,代码如下:

public class MyResultFilterAttribute : FilterAttribute, IResultFilter { private Stopwatch timer; public void OnResultExecuting(ResultExecutingContext filterContext) { timer = Stopwatch.StartNew(); } public void OnResultExecuted(ResultExecutedContext filterContext) { timer.Stop(); filterContext.HttpContext.Response.Write(string.Format("结果执行延迟时间: {0}", timer.Elapsed.TotalSeconds)); } }

我们将自定义的结果过滤器MyResultFilter应用到HomeController的Index方法上,运行结果如下:

Asp.Net MVC学习总结之过滤器详解

 

需要注意的是:动作过滤器是运行在页面输出之前,结果过滤器是运行在页面输出之后。

 2.6、使用异常过滤器

异常过滤器只有在调用一个动作方法而抛出未处理的异常才会运行,这种异常来自以下位置:

A、另一种过滤器(授权、动作、或结果过滤器)。

B、动作方法本身。

C、当动作结果被执行时。

使用内置的异常过滤器

HandleErrorAttribute(处理程序错误特性),它是MVC内嵌的异常过滤器,有以下3个重要的属性:

1.ExceptionType:类型为Type,表示希望被此过滤器处理的异常类型,包括其子类型,默认值为System.Exception

2.View:类型为string,表示此过滤器呈递的视图页面,默认值为Error

3.Master:呈递的视图页的母板页,如果不指定,视图会用其默认的母版页

内嵌的HandleErrorException只有在配置文件Web.config中配置的CustomError 的mode设置为on的时候才生效(其默认模式为RemoteOnly),如下图所示:

此过滤器还会给视图传递一个HandleErrorInfo类型的对象给视图,以便视图可以显示一些额外的关于错误的信息。下面是使用异常过滤器的示例。

应用到Index动作方法上:

Asp.Net MVC学习总结之过滤器详解

在Views/Shared文件夹下添加一个显示异常信息的视图页SpecialError.cshtml,页面代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdpszj.html