1
电子说
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异常处理器:
并且我们可以注册很多个过滤器在全局环境下,那么在此注册的过滤器会应用到整个应用程序当中。
本章对过滤器的类型,作用,定义以及使用方法做了一些说明,当然这些都是比较基础的内容,真正深入的理解还得多多使用,如果文章中有错误或者不足的地方,请大家在评论中指正出来。
全部0条评论
快来发表一下你的评论吧 !