ASP.NET MVC中的ActionFilter介绍学习

一直都知道MVC中的ActionFilter,只是没有在实际项目中使用过。

顾名思义,ActionFilter就是指在Action上的Filter, 那么,在Action上的Filter到底有哪些呢。首先我们看看MVC中的Controller基类(抽象类)

  public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
    {
    }

我们可以看到,它有5个Filter,分别是IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IExceptionFilter, IResultFilter. 我们先看看第一个IActionFilter

IActionFilter解析

从名称就可以看出,IActionFilter是一个接口.源码如下
    //
    // 摘要:
    //     Defines the methods that are used in an action filter.
    public interface IActionFilter
    {
        //
        // 摘要:
        //     Called after the action method executes.
        //
        // 参数:
        //   filterContext:
        //     The filter context.
        void OnActionExecuted(ActionExecutedContext filterContext);
        //
        // 摘要:
        //     Called before an action method executes.
        //
        // 参数:
        //   filterContext:
        //     The filter context.
        void OnActionExecuting(ActionExecutingContext filterContext);
    }

可以看到,该接口中有两个方法,一个是OnActionExecuted (执行完Action之后执行该方法),另一个是OnActionExecuting(执行Action之前执行该方法)

也就是这两个方法分别在Action的前后执行. 所以它可以用于记录日志,获取action的访问量......

知道了之后,那么我们如何来实现ActionFilter呢。

我们注意到,Controller基类继承了IActionFilter接口,而我们在MVC中写的Controller又都继承自Controller基类, 所以我们应该可以直接在MVC的Controller中override这两个方法

1. 用override的方式来实现ActionFilter

 1     public class HomeController : Controller
 2     {
 3         public ActionResult Index()
 4         {
 5             return View();
 6         }
 7
 8         protected override void OnActionExecuting(ActionExecutingContext filterContext)
 9         {
10             filterContext.HttpContext.Response.Write("Execute something before action");
11
12             base.OnActionExecuting(filterContext);
13         }
14
15         protected override void OnActionExecuted(ActionExecutedContext filterContext)
16         {
17             filterContext.HttpContext.Response.Write("Execute something after action");
18
19             base.OnActionExecuted(filterContext);
20         }
21     }

这样好像就可以的,但是它有个问题,就是它只能用于HomeController, 有没有一种方法,我能写一个ActionFilter,可以用于多个Controller中的不同Action呢

显然,可以做到。我们可以自己写一个ActionFilter的类,使它继承IActionFilter, 如下:

2. 自定义一个ActionFilter 属性来实现IActionFilter接口

 1    public class MyActionFilterAttribute : Attribute, IActionFilter
 2     {
 3         public void OnActionExecuted(ActionExecutedContext filterContext)
 4         {
 5             filterContext.HttpContext.Response.Write("Execute something before action");
 6         }
 7
 8         public void OnActionExecuting(ActionExecutingContext filterContext)
 9         {
10             filterContext.HttpContext.Response.Write("Execute something after action");
11         }
12     }

好了,到现在我们就有自己写的ActionFilter了,叫做“MyActionFilter”, 如何使用它呢,很简单的

1     public class HomeController : Controller
2     {
3         [MyActionFilter]
4         public ActionResult Index()
5         {
6             return View();
7         }
8     }

除了上面两种方法,还有没有其他方法呢。事实上是有的,MVC Framework自己给我们提供了一个ActionFilterAttribute特性,这也是一个抽象类,我们来看看源码

 1     //
 2     // 摘要:
 3     //     Represents the base class for filter attributes.
 4     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
 5     public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
 6     {
 7         //
 8         // 摘要:
 9         //     Initializes a new instance of the System.Web.Mvc.ActionFilterAttribute class.
10         protected ActionFilterAttribute();
11
12         //
13         // 摘要:
14         //     Called by the ASP.NET MVC framework after the action method executes.
15         //
16         // 参数:
17         //   filterContext:
18         //     The filter context.
19         public virtual void OnActionExecuted(ActionExecutedContext filterContext);
20         //
21         // 摘要:
22         //     Called by the ASP.NET MVC framework before the action method executes.
23         //
24         // 参数:
25         //   filterContext:
26         //     The filter context.
27         public virtual void OnActionExecuting(ActionExecutingContext filterContext);
28         //
29         // 摘要:
30         //     Called by the ASP.NET MVC framework after the action result executes.
31         //
32         // 参数:
33         //   filterContext:
34         //     The filter context.
35         public virtual void OnResultExecuted(ResultExecutedContext filterContext);
36         //
37         // 摘要:
38         //     Called by the ASP.NET MVC framework before the action result executes.
39         //
40         // 参数:
41         //   filterContext:
42         //     The filter context.
43         public virtual void OnResultExecuting(ResultExecutingContext filterContext);
44     }

所以,我们可以写一个自己的ActionFilter属性,来实现MVC Framework提供的这个类ActionFilterAttribute就好

3. 自定义一个ActionFilter 类来继承ActionFilterAttribute类
namespace MyApplication.Controllers
{
    public class HomeController : Controller
    {
       [MyActionFilter]
       public ActionResult Index()
        {
            return View();
        }
    }

    public class MyActionFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }
    }
}
以上参考 http://www.cnblogs.com/huangxincheng/p/5671106.html

原文地址:https://www.cnblogs.com/wphl-27/p/9322792.html

时间: 2024-10-28 14:24:35

ASP.NET MVC中的ActionFilter介绍学习的相关文章

ASP.NET MVC中Model元数据解析学习

闲来继续学习蒋金楠大师的ASP.NET MVC框架揭秘一书,当前主要阅读的内容是Model元数据的解析,即使是阅读完的现在,仍然有不少细节不是特别明白.好在这部分内容主要是关于Razor引擎的呈现的,通过注解的方式对Model进行自定的修饰,最终使得页面在渲染时(即从cshtml文件转化为html时),相关的数据能够按照指定的形式转化并显示.由于接下来的项目中不再打算使用Razor引擎,该引擎虽然很不错,但也有一些问题,例如存在HTML5代码与HtmlHelper的混写,使得UI层很难与业务代码

<转>ASP.NET学习笔记之在ASP.NET MVC中使用DropDownList

看到一篇关于dropdownlist的用法很好的阐述,比较清楚,留着,防止以后自己不记得,还可以瞅瞅. 在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性Html,它为我们呈现控件提供了捷径. 我们今天主要来讨论Html.DropDownList的用法,首先从Html.TextBox开始. Html.TextBox有一个重载方法形式如下: publi

[转] 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 中使用 SignalR 实现推送功能

一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二.Asp.net SignalR 是个什么东东 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(lo

(转)Asp.Net Mvc视图引擎Razor介绍

Asp.Net Mvc视图引擎Razor介绍 1.Razor介绍 程序园原创,转载请注明:http://www.kwstu.com/ArticleView/dabaomvc_201408240820545275 1)ASP.NET MVC3 带来了一种新的名为Razor 的视图引擎,提供了下列优点: Razor 的语法简单且清晰,只需要最小化的输入 Razor 容易学习,语法类似于 C# 和 VB Visual Studio 对于 Razor 提供了智能提示和语法着色 Razor 视图不需要允许

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表:一个运行在调试模式的应用程序下和一个运行在发布模式的应用程序下.在调试模式下,JavaScript 文件在未使用压缩功能的情况下会被下载.如果想要调试并在 JavaScript 控制器中设置断点,这是必须的.事实上,路由表的产生版本也出现了一些挑战,由于产生路由代码使用的是 JavaScript

《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架,它支持3种不同的技术来创建websites(网站)和Web应用:他们分别是,Web Pages,Web Forms,和MVC.虽然MVC是一种非常流行的,有完整的用于软件开发模式理论的技术,但它在ASP.NET中却是一种新的技术. 目前最新的版本是2012年发布的ASP.NET MVC4.自从2008年发布

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中使用ASP.NE

ASP.NET MVC中使用FluentValidation验证实体

1.FluentValidation介绍 FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开来的验证方式,同时FluentValidation还提供了表达式链式语法. 2.安装FluentValidation FluentValidation地址:http://fluentvalidation.codeplex.com/ 使用Visual Studio的管理NuGet程序包安装FluentVa