ASP.NET MVC 过滤器(三)

作者:弋江区易采办公设备经营部  发布时间:2017-09-06 13:22:41
ASP.NET MVC 过滤器(三)

本篇讲解行为过滤器的执行过程,过滤器实现、使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中,这种编程模式就是横向的插入点),言归正传,我们还是以学习过滤器为主。对于IAuthorizationFilter授权认证过滤器的使用篇幅,我知道怎么用但是写不出来,里面包含知识点很多,功底尚浅写了一半又给删掉了,宁愿不发也不能坑人,在后面的学习中假使我可以掌握了,一定会及时的写出来跟大家分享。这个目录也空在这也算是给自己的一个提醒吧。

ASP.NET MVC过滤器

过滤器在系统框架中的整体对象模型

IAuthorizationFilter授权认证过滤器的执行过程

使用IAuthorizationFilter过滤器

IActionFilter行为过滤器的执行过程

自定义实现IActionFilter行为过滤器

异常过滤器的使用

IActionFilter行为过滤器的执行过程

我们直接进入主题,这里的执行过程还是接着过滤器(一)中的部分,

如图1所示,就是整个的一个执行过程,图太大拆开来看,这样比较细致一点(这里捎带一句,后面许多部分的内容都都包含在这个示意图里,比如说Model元数据、Model绑定和Model验证)。

首先是调用了ControllerActionInvoker类型的GetParameterValues()方法,GetParameterValues()方法的参数是控制器上下文参数对象【ControllerContext类型】和控制器方法描述对象【ActionDescriptor类型】,然后在此方法中会根据ActionDescriptor类型的参数来调用GetParameters()方法获取到控制器方法参数的描述对象【ParameterDescriptor类型】的集合,这里对ParameterDescriptor类型不做过多的讲解,只需了解它是包含了控制器方法参数的一些信息,比如说参数名称、参数类型等等。

从图2中所示的那样,获取到了ParameterDescriptor类型的集合后,便会遍历此集合并且调用图3中所示的ControllerActionInvoker类型的GetParameterValue()方法【这里注意一下跟上面的图2所示的方法是不同的】,调用GetParameterValue()方法的目的是生成一个键值队类型的对象【红色箭头所指】,键值队中的键表示参数名称,值则为参数的值,而生成的过程是:首先MVC框架会调用用户自定义的模型绑定器(如果有自定义的)【实现了IModelBinder接口的类型】,可视化专题,并且调用自定义模型绑定器的方法以此来获取控制器方法参数的参数值,如果没有发现自定义的模型绑定器,则会调用默认的Model绑定器进行参数绑定,如果没有匹配的类型返回一个默认值【ParameterDescriptor.DefaultValue】。(关于Model绑定器内容后续系列会有讲解)

有了参数值信息的键值队过后,接着调用ControllerActionInvoker类型的InvokeActionMethodWithFilters()方法,在此方法会生成两种参数类型以便由ControllerActionInvoker类型的InvokeActionMethodFilter()方法调用,下面我们先讲解这两种参数类型:

ActionExecutingContext

Func<ActionExecutedContext>

第一个参数

复制代码

1 public class ActionExecutingContext : ControllerContext

2 {

3 public ActionExecutingContext();

4 public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> actionParameters);

5

6 public virtual ActionDescriptor ActionDescriptor { get; set; }

7 public virtual IDictionary<string, object> ActionParameters { get; set; }

8 public ActionResult Result { get; set; }

9 }

复制代码

在上面类型的定义中,我们了解到ActionExecutingContext类型继承至ControllerContext类型,并且包含着一些信息的引用,这便是可以在控制器方法执行之前执行自己的一些自定义操作。

第二个参数

复制代码

1 public class ActionExecutedContext : ControllerContext

2 {

3

4 public ActionExecutedContext();

5 public ActionExecutedContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, bool canceled, Exception exception);

6

7 public virtual ActionDescriptor ActionDescriptor { get; set; }

8 public virtual bool Canceled { get; set; }

9 public virtual Exception Exception { get; set; }

10 public bool ExceptionHandled { get; set; }

11 public ActionResult Result { get; set; }

12 }

复制代码

ActionExecutedContext类型跟ActionExecutingContext类型的区别在于前者多了两个属性一个是用于保存异常信息的,另一个属性是用来设置是否处理了异常,这个会在异常过滤器篇幅中讲解。

切回主题,大概知道这两种类型的定义就行了,说到Func<ActionExecutedContext>类型的参数,在MVC框架中默认的设置了Lambda表达式,并且对返回类型中的Result属性又设置了一个表达式调用的是ControllerActionInvoker类型的InvokeActionMethod()方法,这个方法后面会讲到。我们看一下表达式的定义,不然有点混乱:

复制代码

1 Func<ActionExecutedContext> seed = () =>

2 {

3 new ActionExecutedContext(controllerContext,actionDescriptor, false,null)

4 {

5 Result = this.InvokeActionMethod(controllerContext, actionDescriptor, parameters)

6 }

7 };

复制代码

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站推广 https://www.feimao666.com

  • 上一篇:PHP开发环境的配置(Linux平台上安装Apache和PHP)
  • 下一篇:最后一页
  •