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