Action攔截器介面-- IActionFilter,IExceptionFilter, IResultFilter
MVC裡的攔截器介面(也叫過濾器介面)
1、IActionFilter(Action攔截器介面)
Action攔截器分別在“執行Action之前”攔截和“執行Action之後”攔截,2個方法如下:
// 摘要: // Called after the action method executes. // // 引數: // filterContext: // The filter context. void OnActionExecuted(ActionExecutedContext filterContext); // // 摘要: // Called before an action method executes.// // 引數: // filterContext: // The filter context. void OnActionExecuting(ActionExecutingContext filterContext);
看摘要就可以區分出哪個是執行之前攔截和執行之後攔截了,我們只需要實現這個介面就可以在執行Action之前做些處理和執行Action之後做些“善後”處理了。。。。
引數:filterContext 包含了執行整個Action的內容,我們可以取到我們想要的內容,如Action名稱啦,一些引數等等。。。
示例程式碼如:
public void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})已經執行了!<br />" ,filterContext.ActionDescriptor.ActionName)); } public void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})執行之前!<br />" ,filterContext.ActionDescriptor.ActionName)); }
2、 IResultFilter(Result攔截器介面)
IResultFilter 和 IActionFilter 一樣提供2個方法,執行前和執行後,分別是在 返回Result之前執行和返回Result之後執行。介面中的2個方法如下:
/ 摘要: // Called after an action result executes. // // 引數: // filterContext: // The filter context. void OnResultExecuted(ResultExecutedContext filterContext); // // 摘要: // Called before an action result executes. // // 引數: // filterContext: // The filter context. void OnResultExecuting(ResultExecutingContext filterContext);
引數:filterContext包含攔截到的Result等資訊。。。
示例程式碼如:
region IResultFilter 成員
public void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write("Result已經執行了!"); } public void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write("Result執行之前!"); }
這2個介面的區別很明顯:一個攔截 Action、一個攔截Result(這不是廢話嘛,哈哈),又因為Result是Action返回的,
所以 他們的執行順序是:
OnActionExecuting–>Action中的程式碼–>OnActionExecuted–>OnResultExecuting–>OnResultExecuted
由於攔截器的特性,大夥們現在喜歡用他們來做日誌記錄,判斷許可權等功能。。。。。
當然做日誌記錄還經常要記錄一些異常資訊了。。
3、IExceptionFilter(異常攔截器介面)
異常攔截器介面只有一個方法,就是當異常發生時需要執行的內容:
// 摘要: // Called when an exception occurs. // // 引數: // filterContext: // The filter context. void OnException(ExceptionContext filterContext);
引數:filterContext包含異常等資訊。。。
示例程式碼如:
region IExceptionFilter 成員
public void OnException(ExceptionContext filterContext) { string controller = filterContext.RouteData.Values["controller"] as string; string action = filterContext.RouteData.Values["action"] as string; filterContext.RequestContext.HttpContext.Response.Write (string.Format("{0}:{1}發生異常!{2}", controller,action, filterContext.Exception.Message)); filterContext.ExceptionHandled = true; }
程式碼中顯示了出錯的Controller 、action 和異常資訊。。。。此處你可以自定義重定向到錯誤頁面去。。
上面說到大夥們可能會用 IActionFilter做許可權判斷功能,其實我們可以用專業的 IAuthorizationFilter來做許可權判斷。。。
4、IAuthorizationFilter(授權攔截器介面)
該攔截器專門用來判斷許可權,判斷時候有許可權執行後面的Action,此介面在任何攔截器之前執行。。。。。
提供一個方法:
// 摘要: // Called when authorization is required. // // 引數: // filterContext: // The filter context. void OnAuthorization(AuthorizationContext filterContext);
示例程式碼如:
region IAuthorizationFilter 成員
public void OnAuthorization(AuthorizationContext filterContext) { filterContext.HttpContext.Response.Write("執行authorization! 判斷是否有許可權。。。。<br />"); }
完整示例程式碼:
1、MyFilter.cs
程式碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApplication3 { public class MyFilter : FilterAttribute, IActionFilter, IResultFilter, IExceptionFilter, IAuthorizationFilter { #region IActionFilter 成員 public void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})已經執行了!<br />" ,filterContext.ActionDescriptor.ActionName)); } public void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write(string.Format("Action({0})執行之前!<br />" ,filterContext.ActionDescriptor.ActionName)); } #endregion #region IResultFilter 成員 public void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write("Result已經執行了!"); } public void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.Write("Result執行之前!"); } #endregion #region IExceptionFilter 成員 public void OnException(ExceptionContext filterContext) { string controller = filterContext.RouteData.Values["controller"] as string; string action = filterContext.RouteData.Values["action"] as string; filterContext.RequestContext.HttpContext.Response.Write(string.Format("{0}:{1}發生異常!{2}", controller,action, filterContext.Exception.Message)); filterContext.ExceptionHandled = true; } #endregion #region IAuthorizationFilter 成員 public void OnAuthorization(AuthorizationContext filterContext) { filterContext.HttpContext.Response.Write("執行authorization! 判斷時候有許可權。。。。<br />"); } #endregion } }
2、HomeController.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MvcApplication3; namespace MvcApplication3.Controllers { [HandleError] [MyFilter] public class HomeController : Controller { public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } public ActionResult About() { Response.Write("執行about!<br />"); throw new Exception("我是假的異常,呵呵"); //return View(); } } }