0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_78858299 来源:python技术探秘一品文学阁 作者:一品文学阁 2023-03-29 11:20 次阅读

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异常处理器:

图片

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

总结

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

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

    关注

    112

    文章

    15223

    浏览量

    171192
  • Asp.net
    +关注

    关注

    0

    文章

    36

    浏览量

    13778
  • 过滤器
    +关注

    关注

    1

    文章

    407

    浏览量

    18991
  • MVC
    MVC
    +关注

    关注

    0

    文章

    73

    浏览量

    13783
收藏 人收藏

    评论

    相关推荐

    ASP.net Ajax开发.zip

    ASP.net Ajax开发.zip[hide][/hide]《ASP.net Ajax开发》AJAX Control Toolkit中的文本输入处理《ASP.net Ajax开发》初识ASP
    发表于 06-19 21:26

    ASP.NET 2.0网络开发技术》 走进ASP.NET 2.0.pdf

    ASP.NET 2.0网络开发技术》 走进ASP.NET 2.0.pdf[hide][/hide]
    发表于 06-22 21:18

    ASP.net Ajax开发》初识ASP.NET AJAX.pdf

    ASP.net Ajax开发》初识ASP.NET AJAX.pdf[hide][/hide]
    发表于 06-22 21:20

    Programming Microsoft ASP.NET

    Programming Microsoft ASP.NET 3.5 ASP.NET pages are dynamically compiled on demand when first
    发表于 10-21 09:23 59次下载
    Programming Microsoft <b class='flag-5'>ASP.NET</b>

    ASP.NET课程设计案例精编

    ASP.NET课程设计案例精编是一本全面讲解ASP.NET编程方法和技巧的书,从ASP.NET的基本知识点入手,以ASP.NET网络应用为主,详细讲述了大量的编程实例。这些实例基
    发表于 01-07 16:14 144次下载
    <b class='flag-5'>ASP.NET</b>课程设计案例精编

    ASP.NET 2.0网络开发技术》 ASP.NET 2.0核

    ASP.NET 2.0网络开发技术》 ASP.NET 2.0核心对象
    发表于 02-07 15:05 0次下载

    ASP.NET 2.0网络开发技术》 走进ASP.NET 2.

    ASP.NET 2.0网络开发技术》 走进ASP.NET 2.0
    发表于 02-07 15:11 0次下载

    ASP.net Ajax开发》初识ASP.NET AJAX

    ASP.net Ajax开发》初识ASP.NET AJAX
    发表于 02-07 15:11 0次下载

    过滤器的作用

    本视频主要详细介绍了过滤器的作用,分别是滤速高、过滤效果好;强度高、耐腐蚀;静电作用;过滤物质;拦截;其次介绍了水龙头过滤器的作用,最后介绍了活性炭
    的头像 发表于 12-12 16:23 4.2w次阅读

    丝扣Y过滤器

    丝扣Y过滤器是Y过滤器的一种,普通滤材是不锈钢或者碳钢,滤芯普通带有不锈钢骨架。 丝扣Y形过滤器有时也叫做·不锈钢内螺纹Y过滤器。    特性:   1.丝扣Y形
    的头像 发表于 08-13 17:24 3739次阅读

    丝扣Y过滤器过滤器测试原理简介

    丝扣Y过滤器是Y过滤器的一种,普通滤材是不锈钢或者碳钢,滤芯普通带有不锈钢骨架。 丝扣Y形过滤器有时也叫做·不锈钢内螺纹Y过滤器。  特性: 1.丝扣Y形
    发表于 09-05 09:27 2120次阅读

    丝扣Y形过滤器

    丝扣Y形过滤器是保送介质管道上不可短少的一种安装,通常装置在减压阀、泄压阀、定水位阀或其它设备的进口端,用来消弭介质中的杂质,以维护阀门及设备的正常运用。 丝扣Y形过滤器有时也叫做·不锈钢内螺纹
    的头像 发表于 10-24 15:03 3503次阅读

    过滤器药液过滤器滤除率测试仪

    过滤器药液过滤器滤除率测试仪
    的头像 发表于 03-09 14:53 523次阅读
    <b class='flag-5'>过滤器</b>药液<b class='flag-5'>过滤器</b>滤除率测试仪

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

    MVC中的每一个请求,都会分配给相应的控制器(Controller)和对应的行为方法(Action)去处理,那么如果我们想要在Action处理的前后加上一些额外的处理逻辑怎么办呢?这时候就用到了过滤器(Filters)。 在ASP
    的头像 发表于 03-29 11:20 661次阅读
    <b class='flag-5'>ASP.NET</b> <b class='flag-5'>MVC5</b><b class='flag-5'>教学</b><b class='flag-5'>之过滤器</b>(上)

    杀菌过滤器 灭菌过滤器 除菌过滤器

    杀菌过滤器 灭菌过滤器 除菌过滤器
    的头像 发表于 03-03 14:03 1237次阅读
    杀菌<b class='flag-5'>过滤器</b> 灭菌<b class='flag-5'>过滤器</b> 除菌<b class='flag-5'>过滤器</b>