前段時間從外包公司回來,回到公司加入到了公司項目中的開發。看到項目中用到了過濾器,以前沒接觸過,到網上查了一下,結合項目與自己的理解記錄一下。
1、為什么要用到過濾器。2、它能解決什么問題 3、是否會帶來新問題,嚴重不,我們是否能夠解決掉?
在實際項目中,稍微像樣點的項目總會有一些相關的AOP(面向切面,也叫做面向面)編程的組件,而MVC項目中太關心我們這些農民工啦,不想讓MVC開發人員去為了身份驗證、日志、異常等部分重復代碼。於是我們在MVC項目中就可以直接使用它提供的Fileter特性幫我們解決,不用我們自己去實現復雜的AOP了。
以日志為例:
[LogActionFilter(Message="打開企業列表")]
public ActionResult Index()
{
return View();
}
[LogActionFilter(Message="添加企業")]
public ActionResult Add(Contact contact)
{
return View();
}
public class LogActionFilter : ActionFilterAttribute {
public string Message { get; set; }
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//記錄操作日志,寫進操作日志中
var controllerName = filterContext.RouteData.Values["controller"];
var actionName = filterContext.RouteData.Values["action"];
}
}
在合適的地方用到適當的Filter,ASP.NET MVC提供了幾個默認的Filter
Filter Type |
實現接口 |
執行時間 |
Default Implementation |
Authorization filter |
IAuthorizationFilter |
在所有Filter和Action執行之前執行 |
AuthorizeAttribute |
Action filter |
IActionFilter |
分別在Action執行之前和之后執行。 |
ActionFilterAttribute |
Result filter |
IResultFilter |
分別在Action Result執行之后和之前 |
ResultFilterAttribute |
Exception filter |
IExceptionFilter |
只有在filter, 或者 action method, 或者 action result 拋出一個異常時候執行
|
HandleErrorAttribute
|
因為ActionFilterAttribute默認實現了IActionFilter和IResultFilter。而ActionFilterAttribute是一個抽象類型,所以不能直接被實例化使用,所以我們想使用的話必須繼承一下才能夠使用。我們可以重載ActionFilterAttribute類中的以下幾個方法:
OnActionExecuting – 在Action執行之前調用。
OnActionExecuted – 在Action執行之后調用。
OnResultExecuting – 在Result產生之前調用。
OnResultExecuted – 在Result產生之前調用。
根據需要,我們可以在重載的方法中寫入需要的代碼,如上面代碼中,我只是在OnResultExecuted方法中寫入了一些方法,用來記錄操作日志。如果用過濾器進行驗證的話,可以在OnActionExecuting方法里面進行一些驗證。過濾器是在對請求進行處理時對動作邏輯進行擴展的手段,而不需要把這種邏輯包含在動作方法中。
在ASP.NET MVC中還有哪些場合會用到過濾器呢?
- 判斷登錄與否或用戶權限
- 決策輸出緩存
- 防盜鏈
- 防蜘蛛
- 本地化與國際化設置
- 實現動態Action
在園子里記錄一下,方便以后用到后有個簡單的回憶提示。
引用:http://www.cnblogs.com/boruipower/archive/2012/11/18/2775924.html