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

 

  

posted @ 2013-03-08 15:25  禁止吸烟  阅读(11269)  评论(4编辑  收藏  举报