ASP.NET MVC中的ActionFilter是如何执行的?

在ASP.NET MVC中的四大筛选器(Filter),ActionFilter直接应用在某个Action方法上,它在目标Action方法执行前后对调用进行拦截以执行一些额外的操作。这是一种典型的AOP式的设计,如果我们需要在执行某个Action方法的前后执行一些操作,可以通过定义ActionFilter来实现。本篇文章主要讲述多一个应用到相同Action方法上的ActionFilter的执行机制。

一、ActionFilter

ActionFilter允许我们在目标Action方法执行前后对调用进行拦截以执行一些额外的操作,所有的ActionFilter实现了具有如下定义的接口IActionFilter。

   1: public interface IActionFilter   2: {   3:     void OnActionExecuting(ActionExecutingContext filterContext);   4:     void OnActionExecuted(ActionExecutedContext filterContext);   5: }   6:   7: public class ActionExecutingContext : ControllerContext   8: {   9:     public ActionExecutingContext();  10:     public ActionExecutingContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary<string, object> actionParameters);  11:  12:     public virtual ActionDescriptor            ActionDescriptor { get; set; }  13:     public virtual IDictionary<string, object> ActionParameters { get; set; }  14:     public ActionResult                        Result { get; set; }  15: }  16:  17: public class ActionExecutedContext : ControllerContext  18: {  19:     public ActionExecutedContext();  20:     public ActionExecutedContext(ControllerContext controllerContext, ActionDescriptor actionDescriptor, bool canceled, Exception exception);  21:  22:     public virtual ActionDescriptor     ActionDescriptor { get; set; }  23:     public virtual bool                 Canceled { get; set; }  24:     public virtual Exception            Exception { get; set; }  25:     public bool                         ExceptionHandled { get; set; }  26:     public ActionResult                 Result { get; set; }  27: }

如上面的代码片断所示,IActionFilter接口中定义了两个方法OnActionExecuting和OnActionExecuted,这两个方法分别在目标Action方法执行前后被调用,它们的参数类型分别为ActionExecutingContext和ActionExecutedContext。这两个上下文了类型均是ControllerContext的子类。

我们可以从ActionExecutingContext对象中获取到用于描述当前Action的ActionDescriptor,以及参数列表。ActionFilter可以在OnActionExecuting方法中对ActionExecutingContext对象的Result属性进行赋值来直接响应当前的请求。一旦ActionExecutingContext的Result属性被成功赋值,将会终止后续ActionFilter和最终目标方法的执行。

ActionExecutedContext具有额外的三个属性,Exception表示执行Action方法过程中抛出的异常,而ExceptionHandled是一个表示是否对异常已经做出处理的标记。Canceled属性表示没有完成整个ActionFilter链和目标Action方法的执行而中途被终止。

二、ActionFilter的执行机制

当ActionInvoker在执行目标Action方法之前,会根据Order和Scope属性对用于封装ActionFilter的Filter对象进行排序。然后根据当前ControllerContext和ActionDescriptro创建一个ActionExecutingContext对象,并将其作为参数依次调用所有ActionFilter的OnActionExecuting方法。

在这之后真正的目标Action方法被执行,ActionInvoker随后执行后续的筛选操作。具体来说,它根据当前ControllerContext、ActionDescriptro以及Action方法执行过程中抛出的异常创建一个ActionExecutedContext对象。该ActionExecutedContext的Cancel属性为False,如果Action方法返回一个ActionResult对象,该对象将会作为该ActionExecutedContext的Result属性。

接下来按照相反的次序依次调用ActionFilter对象的OnActionExecuted方法,执行过程中的ActionFilter可以修改ActionExecutedContext的Result属性。当整个ActionFilter链执行结束之后,ActionExecutedContext的Result属性返回的ActionResult将会作为对当前请求的响应。右图基本上反映了连同目标Action在内的整个ActionFilter链的执行过程。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, action
, 方法
, 属性
, public
, OnActionExecuting
执行方法
,以便于您获取更多的相关知识。

时间: 2024-12-31 19:23:37

ASP.NET MVC中的ActionFilter是如何执行的?的相关文章

ASP.NET MVC中你必须知道的13个扩展点

ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了ASP.NET MVC中的13个扩展点.Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在 以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助. ASP.NET MVC设计

ASP.NET MVC中实现多个按钮提交的几种方法

有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 方法一:使用客户端脚本 比如我们在View中这样写: 代码<inputtype="submit"value="审核通过"onclick='this.form.action="<%=Url.Action("Action1"

在 ASP.NET MVC 中使用 HTTPS

某些安全性较高的网页,如网上支付或用户登陆页面,可能会使用到https(SSL/TLS)来提高安全性.本文介绍了如何在ASP.NET MVC中强制某action使用https和如何进行向https页面的跳转. 我们先实现强制一个action使用https.这里写了一个RequireHttpsAttribute,它的作用是将非https连接转换成https连接,这样所有使用了RequireHttps这个filter的controller都会强制使用https连接.   1 using System

ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问 WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也没 什么大的差别. 在ASP.NET应用程序里使用ASP.NET AJAX访问WebService通常都是通过 ScriptMananger引入WebService生成客户端代理的方法,同时也可以使用 Microsoft Ajax Library来完成.本文将介绍在ASP.NET MVC中使用AS

ASP.NET MVC中Area的另一种用法

[摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{action}", new { }, newstring[] { "CNBlogs.UcHome.Web.Controllers.Api" }); 我们在ASP.NET MVC中使用Area时通常这么干: 在Web项目中创建Areas文件夹,在其中创建对应的Area文件夹,在其下创建Controllers文件夹.然后在Area文

Asp.Net MVC中如何使用DropDownListFor

在Asp.Net MVC中可以用DropDownListFor的方式来让用户选择已定列表中的一个数值.用法不复杂,这里简单做一个记录. 首先我们要定义一个 Model,用户在 DropDownList 中选择指定的值赋给属性ReadyTimeHour public class EricSunModel { public string ReadyTimeHour { get; set; } } Model定义完毕之后,接下来处理Controller的逻辑 [注:这里用了ViewData来记录Dro

在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证

在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现Model两个中两个属性值的比较验证 具体应用场景为:要对两个属性值的大小进行验证 代码如下所示: /// <summary> /// Specifies that the field must compare favourably with the named field, if objects to check are not of the same type /// false will be r

ASP.NET MVC中的视图生成简介

在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通常,在 Controller 中,我们定义多个 Action ,每个 Action 的返回类型一般是 ActionResult,在 Action 处理的最后,我们返回对于视图的调用. public ActionResult Index() {    return this.View(); } 默认情

asp.net mvc中,ip怎么传入sql数据库库

问题描述 asp.net mvc中,ip怎么传入sql数据库库 asp.net mvc中,我在control中获取了ip地址,但是怎么传入sql数据库呢?新手,只知道怎么提交用户填写的表单里的数据... 解决方案 假设你用的是ef一类的框架,那么xxxDataEntites db = new xxxDataEntites();db.表.Add(new 实体 { ip = 你获得的ip });db.SaveChanges(); 解决方案二: ajax啊,你给他绑到用户点击的地方 解决方案三: 在数