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
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
} protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("Execute something before action"); base.OnActionExecuting(filterContext);
} protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("Execute something after action"); base.OnActionExecuted(filterContext);
}
}
这样好像就可以的,但是它有个问题,就是它只能用于HomeController, 有没有一种方法,我能写一个ActionFilter,可以用于多个Controller中的不同Action呢
显然,可以做到。我们可以自己写一个ActionFilter的类,使它继承IActionFilter, 如下:
2. 自定义一个ActionFilter 属性来实现IActionFilter接口
public class MyActionFilterAttribute : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("Execute something before action");
} public void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write("Execute something after action");
}
}
好了,到现在我们就有自己写的ActionFilter了,叫做“MyActionFilter”, 如何使用它呢,很简单的
public class HomeController : Controller
{
[MyActionFilter]
public ActionResult Index()
{
return View();
}
}
除了上面两种方法,还有没有其他方法呢。事实上是有的,MVC Framework自己给我们提供了一个ActionFilterAttribute特性,这也是一个抽象类,我们来看看源码
//
// 摘要:
// Represents the base class for filter attributes.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
{
//
// 摘要:
// Initializes a new instance of the System.Web.Mvc.ActionFilterAttribute class.
protected ActionFilterAttribute(); //
// 摘要:
// Called by the ASP.NET MVC framework after the action method executes.
//
// 参数:
// filterContext:
// The filter context.
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
//
// 摘要:
// Called by the ASP.NET MVC framework before the action method executes.
//
// 参数:
// filterContext:
// The filter context.
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
//
// 摘要:
// Called by the ASP.NET MVC framework after the action result executes.
//
// 参数:
// filterContext:
// The filter context.
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
//
// 摘要:
// Called by the ASP.NET MVC framework before the action result executes.
//
// 参数:
// filterContext:
// The filter context.
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
}
所以,我们可以写一个自己的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
ASP.NET MVC中的ActionFilter介绍学习的更多相关文章
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
- Ext.Net学习笔记24:在ASP.NET MVC中使用Ext.Net
在前面的笔记中已经介绍了如何在ASP.NET WebForm中使用Ext.Net,由于这个系列一直在WebForm中使用,所以并没有涉及到ASP.NET MVC中的用法. 如果你要在ASP.NET M ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- 在 ASP.NET MVC 中使用 HTTPS (SSL/TLS) -- 学习
在 ASP.NET MVC 中使用 HTTPS (SSL/TLS) IS 7如何实现http重定向https HTTPS 升级指南
- <转>ASP.NET学习笔记之在ASP.NET MVC中使用DropDownList
看到一篇关于dropdownlist的用法很好的阐述,比较清楚,留着,防止以后自己不记得,还可以瞅瞅. 在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便 ...
- ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用
Ajax的全名为:Asynchronous Javascript And XML(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术.Ajax技术首先向Web服务器发送 ...
- [转]ASP.NET MVC中你必须知道的13个扩展点
本文转自:http://www.cnblogs.com/ejiyuan/archive/2010/03/09/1681442.html ScottGu在其最新的博文中推荐了Simone Chiaret ...
- ASP.NET MVC中你必须知道的13个扩展点
ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
随机推荐
- javascript箭头函数把函数给简写了[0403]
箭头函数把函数给简写了[0403] 我不是很喜欢箭头函数,总觉得它让原本就不那么严谨的js更加不严谨了,所以有时候看js程序也是一件很头痛的事情,不过在ES6中加入了这么一个新的方法,已 ...
- http keep-alive简解
http协议中,客户端发送请求,服务端在接收到请求后,返回所需要的数据后可以关闭连接,这样客户端读取完数据时会返回EOF(-1),表明数据已接受完全 备注:EOF end of file 什么是kee ...
- <HTTP协议详解>由浅入深看HTTP
一. HTTP协议的应用简单概况 HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST ...
- php中删除数组的第一个元素和最后一个元素的函数
对于一个php数组,该如何删除该数组的第一个元素或者最后一个元素呢?其实这两个过程都可以通过php自带的函数 array_pop 和 array_shift 来完成,下面就具体介绍一下如何来操作. ( ...
- JSP&EL 内置对象
JSP&EL 内置对象 转载▼ 具体的JSP和El中的内置对象见下表,由于我写在了excel中,也不知道怎么把excel发出来,就截了图. 相关问题: Q1: JSP:EL中 pageCo ...
- Linux各个文件夹的主要作用 (源地址
(源地址blog.csdn.net/lonelysky/article/details/5374230,侵删) linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev ...
- ssm+dubbo/zk
1.原始 Connection conn = null; String url = "jdbc:mysql://localhost:3306/emps?user=root&passw ...
- c#基础综述
一个相关的博客:http://blog.csdn.net/zhang_xinxiu/article/details/8605980 很好的一个网站:http://www.runoob.com/
- ReactJS结合ES6入门Template
一.前言 二.介绍 ReactJS ECMAScript 6 三.入门DEMO "Hello,XXX“ 输出 ES5写法 <div id="example"> ...
- hibernate复习第(二)天
今日要点: 关联映射 多对一(Employee - Department) 一对多(Department - Employee) 一对一(Person - IdCard) 多对多(teachet - ...