结合EF5.0讲MVC4(三)--为我们的程序添加过滤器
本节导航
1、过滤器介绍
2、创建自己的过滤器
1、过滤器介绍
要使用过滤器,我们的过滤器类需要继承ActionFilterAttribute抽象类。
在我们的过滤器类里需要重写(override)OnActionExecuting(ActionExecutingContext filterContext)和OnActionExecuted(ActionExecutedContext filterContext)
过滤器的作用在于:判断用户登录和权限、动态Action、防篡改等等。
2、创建自己的过滤器
我们创建的这个过滤器的作用主要是用来记录日志,所以在开始之前,我们需要在【Models】文件夹下新建一个名为OperLog的类,类的内容如下
public class OperLog { public int OperLogID { get; set; } public string ControllerName { get; set; } public string ActionName { get; set; } public string IpAddress { get; set; } }
然后在【Dal】文件夹下的MovieContext类中加入
public DbSet<OperLog> OperLog { get; set; }
接下来,找到【Filters】文件夹,在里面新建类:MyFilter。并集成ActionFilterAttribute抽象类,然后重写上面提到的两个方法。我们看完整的MyFilter代码
public class MyFilter:ActionFilterAttribute { MovieContext db = new MovieContext(); public override void OnActionExecuting(ActionExecutingContext filterContext) { //base.OnActionExecuting(filterContext); OperLog ol = new OperLog() { ControllerName=filterContext.Controller.ToString(), ActionName=filterContext.ActionDescriptor.ActionName, IpAddress=filterContext.HttpContext.Request.UserHostAddress }; db.OperLog.Add(ol); db.SaveChanges(); } public override void OnActionExecuted(ActionExecutedContext filterContext) { // base.OnActionExecuted(filterContext); } }
不难看出,我们想要得到的是在Action执行的时候,获取到控制器名称、方法名以及客户端的Ip地址,然后保存到OperLog这张表中。
为了我们方便的查看日志,我想在页面上添加一个入口,因此,我要添加关于OperLog的控制器同时生成了5个页面。然后在_Laout中添加menu菜单,指向OperLogController的Index。
那么我们的过滤器要怎么用呢?很简单,只要将过滤器类当做类属性或者方法属性就可以了。比如我要记录我对Movie的操作,那么我要做的工作是在MovieController类前或者方法前加上[MyFilter]即可,如下代码:
或者在MovieController上加上这句话。我这示例中把MyFilter放在了Moviecontroller上,用来检测所有的Action的执行。那么执行的效果如图
还有更多的关于过滤器的使用方法,这里的这篇文章就当抛砖引玉吧。
更:2013/3/8
如果你写的过滤器是一个全局过滤器的话,可以这样写。在【App_Start】文件夹下找到FilterConfig文件并打开,将我们的过滤器添加到全局过滤器集合中就可以了。那么我们的任何操作都会被记录下来。
更:2013/9/5
在设置了全局过滤器之后,也有可能遇到有些Controller例外的情况。比如情景:开发人员通过Session判断是否登录超时,那么这里就需要用到全局过滤器,但是我们的登录controller:Account不需要执行这个过滤器。那么这个全局过滤器要这样写:
同时,我们需要在超时之后跳转到登录页面,这里这样写:
filterContext.Result = new RedirectResult("/Account/Login");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?