今天大家共同學習下ASP.NET MVC2.0中自訂filters,這一節主要學習下ActionFilterAttribute,
ActionFilterAttribute繼承IActionFilter, IResultFilter介面,並且繼承FilterAttribute類.
ActionFilterAttribute可以監控action執行過程中所有階段,包括日誌,異常處理等功能.
主要包括以下四個重載方法
OnActionExecuting,OnActionExecuted,OnResultExecuting,OnResultExecuted
1.OnActionExecuting是在action開始前執行
用於身分識別驗證和伺服器端緩衝輸出
2. OnActionExecuted在action結束後執行
主要用於異常處理
3. OnResultExecuting在返回result前執行
主要用於設定用戶端緩衝和伺服器端壓縮
4. OnResultExecuted在返回result後執行
主要用於異常處理和頁面尾部輸出調試資訊
以下兩個DEMO,將展示actionfilter的具體用法
demo1:
在這個DEMO中我們將展示action在各個階段的執行時間,並在頁面中輸出。
首先我們定義一個ActionLogAttribute類
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcAppOne.ActionFilters{ public class ActionLogAttribute : ActionFilterAttribute { /// <summary> /// 表示actionID /// </summary> public int ID { get; set; } /// <summary> /// 在 action開始前執行 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon開始執行" + DateTime.Now.ToString() + "<br/>"); base.OnActionExecuting(filterContext); } /// <summary> /// 在action結束後執行 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":actinon執行結束" + DateTime.Now.ToString() + "<br/>"); base.OnActionExecuted(filterContext); } /// <summary> /// 在result開始前執行 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result執行開始" + DateTime.Now.ToString() + "<br/>"); base.OnResultExecuting(filterContext); } /// <summary> /// 在result結束後執行 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(ID.ToString()+":result執行結束" + DateTime.Now.ToString() + "<br/>"); base.OnResultExecuted(filterContext); } }}
然後我們建立一個VIEW頁面,ShowNews頁面
然後再建立一個ACTION,並把屬性標記在action上面
[ActionFilters.ActionLog(ID=3)] public ActionResult ShowNews() { return View(); }
此時我們運行ShowNews頁面,我們將看到如下效果
demo2: 接著我們看第二個DEMO,在這個demo中,我們將展現actionFILTER中各個方法的作用
我們建一個類 ActionDealAttribute
public class ActionDealAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { //使用者沒有驗證通過,轉向登入頁面 if (!filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated) { filterContext.Result = new RedirectResult("../account/logon"); } } public override void OnActionExecuted(ActionExecutedContext filterContext) { //異常處理 if (filterContext.Exception!=null) { filterContext.ExceptionHandled=true; filterContext.Result = new RedirectResult("../shared/Error");//轉向錯誤頁面 } } public override void OnResultExecuting(ResultExecutingContext filterContext) { base.OnResultExecuting(filterContext); } public override void OnResultExecuted(ResultExecutedContext filterContext) { base.OnResultExecuted(filterContext); } }
再建立一個news頁面,並建立一個對應的action
如果訪問news頁面需要登入才能訪問,就在news對應的action標記此屬性,在OnActionExecuting中進行處理
[ActionFilters.ActionDeal] public ActionResult News() { return View(); }
如果news頁面訪問的時候出現異常,就會轉向錯誤頁面,在OnActionExecuted中進行處理
[ActionFilters.ActionDeal] public void News() { throw new Exception(); }
以上只是自訂action的簡單用法,供大家參考。
代碼下載:http://download.csdn.net/detail/zx13525079024/4375094