1. 程式人生 > 實用技巧 >Action攔截器介面-- IActionFilter,IExceptionFilter, IResultFilter

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();
    }
}
}