本節導航
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");