ASP.NET MVC 过滤器(四)

前言

前一篇对IActionFilter方法执行过滤器在框架中的执行过程做了大概的描述,本篇将会对IActionFilter类型的过滤器使用来做一些介绍。

ASP.NET MVC过滤器

  • 过滤器在系统框架中的整体对象模型
  • IAuthorizationFilter授权认证过滤器的执行过程
  • 使用IAuthorizationFilter过滤器
  • IActionFilter行为过滤器的执行过程
  • 自定义实现IActionFilter行为过滤器
  • 异常过滤器的使用

自定义实现IActionFilter行为过滤器

还是接着前面控制器篇幅的示例来演示,没看过的朋友也没关系,只要有个一个基础的显示页面就可以了。

图1

这是初始页面调用了IoCDemoController控制器默认的Index方法。

下面我们来实现我们自定义的IActionFilter类型。

代码1-1

     public class MyCustomActionFilterAttribute : FilterAttribute, IActionFilter
{ public void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("这是在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之后"); } public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("这是在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之前");
}
}

在上篇中我们对上述代码的中设计到类型结构已经作了描述了,在此不再重复,我们定义好了行为过滤器那就把它用起来。

在应用了此过滤器过后我们再来看一下运行的结果:

图2

我们可以试着把过滤器放在所要执行的控制器行为上,而不是控制器:

代码1-2

     public class IoCDemoController : Controller
{
private IDataStandard _DataStandard; public IoCDemoController(IDataStandard dataStandard)
{
_DataStandard = dataStandard;
} [MyCustomActionFilter]
public ActionResult Index()
{
return View(_DataStandard.GetProducts()); }
}

再次运行发现结果会和放在控制器上的结果一样。唯一不同的是过滤器的应用范围不同,放在方法上的时候只有在请求这个控制器行为的时候才会调用这些过滤器,而放在控制器上的过滤器,无论你请求控制器中的哪个行为都会调用。

过滤器的执行顺序

通过前几篇的学习,我们从框架的硬编码中可以看出,控制器不同类型的执行顺序,依次是授权认证过滤器、行为过滤器、结果过滤器。而还有一种异常过滤器,是不受限制的,只要有异常就会触发调用。这里说的是不同类型的过滤器之前的框架调用顺序,那么同一种类型过滤器之间的调用顺序我们怎么控制呢?来看示例:

代码1-3

     public class MyCustomActionFileterOneAttribute : FilterAttribute, IActionFilter
{ public void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("这是" + this.GetType().Name + "过滤器在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之后输出");
} public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("这是"+this.GetType().Name+"过滤器在控制器方法:" + filterContext.ActionDescriptor.ActionName + "-执行之前输出");
}
}

并且上述1-1代码中的输出示例修改为1-3这样的输入示例,然后我们再把新定义的行为过滤器加到行为方法上:

         [MyCustomActionFilter]
[MyCustomActionFileterOne]
public ActionResult Index()
{
return View(_DataStandard.GetProducts());
}

我们看一下结果如图:

图3

看到这个结果,有的朋友可能会说了,是按照添加后位置的顺序来执行的,可以这么说吧,我们再来修改一下添加在Index()方法之上的两个过滤器中的属性变量Order,这个属性来至IMvcFilter接口类型,所有的过滤器类型都是要实现它的,只不过在我们自定义中的FilterAttribute类型已经帮我们实现了。

看下修改后的示例代码:

代码1-4

         [MyCustomActionFilter(Order=)]
[MyCustomActionFileterOne(Order=)]
public ActionResult Index()
{
return View(_DataStandard.GetProducts());
}

运行结果如图:

对于过滤器的使用还有许多种方式,本篇的IActionFilter类型过滤器就讲解到这里。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 过滤器(四)的更多相关文章

  1. ASP.NET MVC中有四种过滤器类型

    在ASP.NET MVC中有四种过滤器类型

  2. ASP.NET MVC 过滤器(一)

    ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...

  3. ASP.NET MVC 视图(四)

    ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...

  4. ASP.NET MVC 路由(四)

    ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...

  5. ASP.NET MVC 过滤器(三)

    ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...

  6. ASP.NET MVC 过滤器(五)

    ASP.NET MVC 过滤器(五) 前言 上篇对了行为过滤器的使用做了讲解,如果在控制器行为的执行中遇到了异常怎么办呢?没关系,还好框架给我们提供了异常过滤器,在本篇中将会对异常过滤器的使用做一个大 ...

  7. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  8. Asp.net Mvc 过滤器执行顺序

    Asp.net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)- ...

  9. ASP.NET MVC过滤器

    在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...

随机推荐

  1. ASP.Net Core 里是如何把一个普通的 Action 返回类型转换为某种 IActionResult 的

    秘密在于这个类型: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker 在它的 CreateActionResult 方法里会将相关类型 ...

  2. 个人总结深入.NET平台和C#编程

    前言:学习C#编程应该有几个月了,作为一个菜鸟,没有资格来评论什么.只有对自己所学进行一个总结,可能有不严谨的地方,万望谅解.          一·深入.NET框架 .NET框架(.NET Fram ...

  3. java对象转换成json

    package com.bjs.acrosstime.utils; import java.util.ArrayList; import java.util.Date; import java.uti ...

  4. STL插入删除和查询测试

    博客园的markdown不知道怎么插入C++代码,只好放弃了..本文在我的blog发布:http://jwk000.github.io/2015/09/02/20150902/

  5. 代替jquery $.post 跨域提交数据的N种形式

    跨域的N种形式: 1.直接用jquery中$.getJSON进行跨域提交 优点:有返回值,可直接跨域: 缺点:数据量小: 提交方式:仅get (无$.postJSON) $.getJSON(" ...

  6. linux安装oracle11g

    准备oracle安装文件 Oracle11gR2包含两个文件linux_11gR2_database_1of2.zip和linux_11gR2_database_2of2.zip,将这两个文件通过SS ...

  7. MySQL多表查询

    第一种: select a.a1,a.a2,a.a3,b.b2,c.c2,d.d2 from a,b,c,d where a.a1=b.b1 and b.b1=c.c1 and c.c1=d.d1 第 ...

  8. 关于使用iframe嵌套页面的跳转方式

    一.背景A,B,C,D都是jsp,D是C的iframe,C是B的iframe,B是A的iframe,在D中跳转页面的写法区别如下. 二.JS跳转window.location.href.locatio ...

  9. QGis、Gdal本地中文路径问题

    编译qgis完整项目后,由于Gdal库的原因,中文路径下通过添加矢量数据中数据库中是没有OGR的Oracle数据库功能的: 最开始打算通过重新编译gadl库从内部支持中文的(有成功的麻烦也请告诉我), ...

  10. @Autowired

    1. Spring框架中进行注入式,使用@Autowired. @Autowired可以对成员变量.方法和构造函数进行标注,来完成自动装配的工作,这里必须明确:@Autowired是根据类型进行自动装 ...