ASP.NET MVC5教学之过滤器(下)

onactionexecuted方法在action操作方法调用之后执行,传递给onactionexecuted方法的参数是actionexecutedcontext对象。这个类比actionexecutingcontext对象多了些属性,如下:
名称类型说明
actiondescriptor actiondescriptor 获取或设置操作描述符。
canceled bool 获取或设置一个值,该值指示此actionexecutedcontext 对象已被取消。
exception exception 获取或设置在操作方法的执行过程中发生的异常(如果有)。
exceptionhandled bool 获取或设置一个值,该值指示是否处理异常。
result actionresult 获取或设置由操作方法返回的结果。
我们可以通过onactionexecuted方法来执行一些跨越动作方法的任务,比如我们可以用它来获取动作方法执行的时间。我们修改 myactionattribute 过滤器代码如下:
public class myactionattribute : actionfilterattribute{ private stopwatch timer; /// /// action调用之前运行 /// /// public override void onactionexecuting(actionexecutingcontext filtercontext) { timer = stopwatch.startnew(); } /// /// action调用之后运行 /// /// public override void onactionexecuted(actionexecutedcontext filtercontext) { timer.stop(); filtercontext.httpcontext.response.write($方法执行时间:{timer.elapsed.totalseconds:f6}s); }}我们在方法启动之前启动了一个计时器,在方法执行后停止了它,并且将这个时间间隔输出到我们的页面上。重新编译打开index页面,显示如下:
结果过滤器结果过滤器,顾名思义针对的是动作方法返回的结果,它在我们的动作方法结果返回前后执行。
创建结果过滤器需要实现iresultfilter接口。actionfilterattribute类帮我们实现了iresultfilter接口,我们可以直接继承actionfilterattribute创建我们的过滤器,然后通过重写onresultexecutin和onresultexecuting(在执行操作结果后调用)方法来实现过滤器规则。
onresultexecuting方法会在执行操作结果前调用,这个方法的参数是一个resultexecutingcontext对象,属性如下:
名称类型说明
cancel bool 获取或设置一个值,该值指示此 resultexecutingcontext 值是否为“cancel”。
result actionresult 获取或设置操作结果。
onresultexecuted方法在执行操作结果后调用,这个方法的参数是一个resultexecutingcontext对象,属性如下:
名称类型说明
canceled bool 获取或设置一个值,该值指示此 resultexecutingcontext 值是否为“cancel”。
exception exception 获取或设置在操作方法的执行过程中发生的异常(如果有)。
exceptionhandled bool 获取或设置一个值,该值指示是否处理异常。
result actionresult 获取或设置操作结果。
我们可以使用这两个方法在action方法返回结果前后进行操作,具体操作的代码我就不赘述了。
异常处理过滤器异常处理过滤器需要实现的接口为iexceptionfilter。我们看下接口的定义:
//// 摘要:// 定义异常筛选器所需的方法。public interface iexceptionfilter{ // // 摘要: // 在发生异常时调用。 // // 参数: // filtercontext: // 筛选器上下文。 void onexception(exceptioncontext filtercontext);}接口方法onexception可以看到它在我们的方法中出现异常时触发,mvc默认用handleerrorattribute类来实现了此接口,我们自己定义的异常过滤器可以继承此类进行扩展。
onexception方法中传递的参数是一个exceptioncontext对象,它的属性如下:
名称类型说明
exception exception 获取或设置异常对象。
exceptionhandled bool 获取或设置一个值,该值指示是否已处理异常。
result actionresult 获取或设置操作结果。
我们来定义一个异常过滤器,代码如下:
public class myexceptionattribute : handleerrorattribute{ public override void onexception(exceptioncontext filtercontext) { //如果有异常,跳转到异常页面。 if (filtercontext.exception != null) { //跳转到自定义的错误页 actionresult view = new viewresult() { viewname = error }; filtercontext.result = view; //异常处理结束后,一定要将exceptionhandled设置为true,否则仍然会继续抛出错误。 filtercontext.exceptionhandled = true; } }}当我们的方法中出现异常时,会将views文件夹下shared中的error.cshtml页面返回到客户端,客户端页面不再显示成黄页,给用户一个良好的体验。
我们给index方法添加上我们的异常处理器,再加一段引发异常的代码看下效果。
打开index视图:
视图中显示的是error页面中的内容。
通常我们用异常处理器来记录我们的程序异常日志,或者在产生异常时给客户端返回一个友好的提示内容。
过滤器的使用方法在上文的一些例子中,我们把过滤器的特性都定义在了action方法上,其实过滤器不仅可以应用在action方法中,还可在应用在controller和全局配置中。
应用在controller中的使用方法和action一致,在controller类名上方添加特性标签即可。如图:
全局环境下的过滤器,则需要注册到filterconfig文件中,例如mvc默认给我们注册的handleerrorattribute异常处理器:
并且我们可以注册很多个过滤器在全局环境下,那么在此注册的过滤器会应用到整个应用程序当中。
总结本章对过滤器的类型,作用,定义以及使用方法做了一些说明,当然这些都是比较基础的内容,真正深入的理解还得多多使用,如果文章中有错误或者不足的地方,请大家在评论中指正出来。

5G毫米波将如何为生活带来便利
自由软件与价格无关
中移找TA定位器引领智能定位潮流 艾拉比OTA升级为智能定位助力
Dialog半导体公司最新蓝牙低功耗无线多核MCU系列
PCB的输电系统(PDS)设计
ASP.NET MVC5教学之过滤器(下)
脑机接口技术:大脑植入装置能实现心灵感应吗
魅族H1心率手环评测 和小米手环2有着异曲同工之处
5G手机真正的较量将在2020年开始
区块链投资新套路,需擦亮眼睛
盘点企业云计算失败的7大原因
一文详解STM32的时钟系统
多电脑切换器是什么
查验电控锁安裝是不是达标的方法是怎样的
ICO是个破碎的承诺,数字化的墓地
网友买到小米Note2山寨机?结果却很意外
RK3568麒麟系统板卡
汽车新安全技术将提高事故的生存率
关于灰尘传感器/粉尘传感器/PM2.5传感器DSM501的特性
车载摄像头的工作原理、分类及仿真验证