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

电子说

1.2w人已加入

描述

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页面,显示如下:

MVC

结果过滤器

结果过滤器,顾名思义针对的是动作方法返回的结果,它在我们的动作方法结果返回前后执行。

创建结果过滤器需要实现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方法添加上我们的异常处理器,再加一段引发异常的代码看下效果。

MVC

打开Index视图:

MVC

视图中显示的是Error页面中的内容。

通常我们用异常处理器来记录我们的程序异常日志,或者在产生异常时给客户端返回一个友好的提示内容。

过滤器的使用方法

在上文的一些例子中,我们把过滤器的特性都定义在了Action方法上,其实过滤器不仅可以应用在Action方法中,还可在应用在Controller和全局配置中。

应用在Controller中的使用方法和Action一致,在Controller类名上方添加特性标签即可。如图:

MVC

全局环境下的过滤器,则需要注册到FilterConfig文件中,例如MVC默认给我们注册的HandleErrorAttribute异常处理器:

MVC

并且我们可以注册很多个过滤器在全局环境下,那么在此注册的过滤器会应用到整个应用程序当中。

总结

本章对过滤器的类型,作用,定义以及使用方法做了一些说明,当然这些都是比较基础的内容,真正深入的理解还得多多使用,如果文章中有错误或者不足的地方,请大家在评论中指正出来。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分