轉自:http://www.studyofnet.com/news/257.html
APS.NET MVC中的每一個請求,都會分配給相應的控制器和對應的行為方法去處理,而在這些處理的前前后后如果想再加一些額外的邏輯處理。這時候就用到了過濾器。
在Asp.netMvc中當你有以下及類似以下需求時你可以使用Filter功能
MVC支持的過濾器類型有四種,分別是:Authorization(授權),Action(行為),Result(結果)和Exception(異常)。
如下表
過濾器類型 | 接口 | 描述 |
Authorization | IAuthorizationFilter | 此類型(或過濾器)用于限制進入控制器或控制器的某個行為方法 |
Exception | IExceptionFilter | 用于指定一個行為,這個被指定的行為處理某個行為方法或某個控制器里面拋出的異常 |
Action | IActionFilter | 用于進入行為之前或之后的處理 |
Result | IResultFilter | 用于返回結果的之前或之后的處理 |
但是默認實現它們的過濾器只有三種,分別是Authorize(授權),ActionFilter,HandleError(錯誤處理);各種信息如下表所示
過濾器 | 類名 | 實現接口 | 描述 |
ActionFilter | AuthorizeAttribute | IAuthorizationFilter | 此類型(或過濾器)用于限制進入控制器或控制器的某個行為方法 |
HandleError | HandleErrorAttribute | IExceptionFilter | 用于指定一個行為,這個被指定的行為處理某個行為方法或某個控制器里面拋出的異常 |
自定義 | ActionFilterAttribute | IActionFilter和IResultFilter | 用于進入行為之前或之后的處理或返回結果的之前或之后的處理 |
一、應用于Action的Filter
創建 Action filter 必須實現 IActionFilter 接口,該接口定義了兩個方法
方法名 | 調用時機 | 可進行的操作 |
OnActionExecuting | Action方法執行之前 | 可以給 filterContext.Result 賦值,以阻止 Action 的執行可以通過 filterContext.ActionParameters 查看或修改 Action 的參數 |
OnActionExecuted | Action方法執行之后 | 可以通過 filterContext.Exception 獲取 Action 執行時拋出的異常,并能把它標記為“已處理”:filterContext.ExceptionHandled = true??梢圆榭赐ㄟ^filterContext.Result查看 Action 的執行結果,但是不能修改。 |
Action過濾器是通過繼承ActionFilterAttribute類來實現的一個Attribute類。ActionFilterAttribute 是一個抽象類,提供了兩個virtual的方法給我們重寫,OnActionExecuting和OnActionExecuted。
ASP.NET MVC 框架會在調用Action方法之前調用你Action過濾器中的OnActionExecuting方法,在之后調用Action過濾器中的OnActionExecuted方法。當然在創建Action過濾器的時候你不需兩個方法都實現。
下面的示例是在調用Action方法之前和之后的日志跟蹤:
C# 代碼 復制public class LoggingFilterAttribute : ActionFilterAttribute
{public override void OnActionExecuting(FilterExecutingContext
filterContext)
{
filterContext.HttpContext.Trace.Write("Starting: " +
filterContext.ActionMethod.Name);
}
![]()
public override void OnActionExecuted(FilterExecutedContext
filterContext)
{
if (filterContext.Exception != null)
{
filterContext.HttpContext.Trace.Write("Exception thrown");
}
}
}
部分參數說明
Action Filter Context
OnActionExecuting方法有一個類型為FilterExecutingContext的參數,而OnActionExecuted方法有一個相應的類型為FilterExcutedContext的參數。兩個Context類都是繼承自FilterContext類,而FilterContext類繼承自ControllerContext類并包含一個ActionMethod屬性。你可以使用ActionMethod屬性來堅定這個Action過濾器是應用到哪個Action方法上的。
FilterExecutingContext類包含一個 Cancel 的屬性,允許你取消當前的Action。
FilterExcutedContext類包含一個Exception屬性和一個ExceptionHandled屬性。如果Exception屬性為null,則沒有異常在action stack中,表明Action方法運行并沒有發生錯誤。如果Exception屬性不為null,則過濾器知道該怎么處理,過濾器處理完異常后會發出已經處理完的信號,然后將ExceptionHandled屬性設為true。就算ExceptionHandled屬性為true,堆棧中添加到其他Action方法的OnActionExcetued方法將會照常被調用,這種場景就如就算一個異常被處理了,日志記錄filter一樣照常執行。
使用方法
你可以將過濾器應用到任何一個你喜歡的Action方法上。下面的示例演示一個控制器中包含的用Action過濾器Attribute標記的Action方法。
C# 代碼 復制public class HomeController : Controller
{[LoggingFilter]
public void Index()
{
RenderView("Index");
}
![]()
[LoggingFilter]
public void About()
{
RenderView("About");
}
![]()
[LoggingFilter]
pub
新聞熱點
疑難解答