结合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");