OnActionExecuted方法在Action操作方法調(diào)用之后執(zhí)行,傳遞給OnActionExecuted方法的參數(shù)是ActionExecutedContext對象。這個類比ActionExecutingContext對象多了些屬性,如下:
| 名稱 | 類型 | 說明 |
|---|---|---|
| ActionDescriptor | ActionDescriptor | 獲取或設(shè)置操作描述符。 |
| Canceled | bool | 獲取或設(shè)置一個值,該值指示此ActionExecutedContext 對象已被取消。 |
| Exception | Exception | 獲取或設(shè)置在操作方法的執(zhí)行過程中發(fā)生的異常(如果有)。 |
| ExceptionHandled | bool | 獲取或設(shè)置一個值,該值指示是否處理異常。 |
| Result | ActionResult | 獲取或設(shè)置由操作方法返回的結(jié)果。 |
我們可以通過OnActionExecuted方法來執(zhí)行一些跨越動作方法的任務(wù),比如我們可以用它來獲取動作方法執(zhí)行的時間。我們修改 MyActionAttribute 過濾器代碼如下:
public class MyActionAttribute : ActionFilterAttribute
{
private Stopwatch timer;
///
/// Action調(diào)用之前運(yùn)行
///
///
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
timer = Stopwatch.StartNew();
}
///
/// Action調(diào)用之后運(yùn)行
///
///
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
timer.Stop();
filterContext.HttpContext.Response.Write($"方法執(zhí)行時間:{timer.Elapsed.TotalSeconds:F6}s");
}
}
我們在方法啟動之前啟動了一個計(jì)時器,在方法執(zhí)行后停止了它,并且將這個時間間隔輸出到我們的頁面上。重新編譯打開Index頁面,顯示如下:

結(jié)果過濾器
結(jié)果過濾器,顧名思義針對的是動作方法返回的結(jié)果,它在我們的動作方法結(jié)果返回前后執(zhí)行。
創(chuàng)建結(jié)果過濾器需要實(shí)現(xiàn)IResultFilter接口。ActionFilterAttribute類幫我們實(shí)現(xiàn)了IResultFilter接口,我們可以直接繼承ActionFilterAttribute創(chuàng)建我們的過濾器,然后通過重寫OnResultExecutin和OnResultExecuting(在執(zhí)行操作結(jié)果后調(diào)用)方法來實(shí)現(xiàn)過濾器規(guī)則。
OnResultExecuting方法會在執(zhí)行操作結(jié)果前調(diào)用,這個方法的參數(shù)是一個ResultExecutingContext對象,屬性如下:
| 名稱 | 類型 | 說明 |
|---|---|---|
| Cancel | bool | 獲取或設(shè)置一個值,該值指示此 ResultExecutingContext 值是否為“cancel”。 |
| Result | ActionResult | 獲取或設(shè)置操作結(jié)果。 |
OnResultExecuted方法在執(zhí)行操作結(jié)果后調(diào)用,這個方法的參數(shù)是一個ResultExecutingContext對象,屬性如下:
| 名稱 | 類型 | 說明 |
|---|---|---|
| Canceled | bool | 獲取或設(shè)置一個值,該值指示此 ResultExecutingContext 值是否為“cancel”。 |
| Exception | Exception | 獲取或設(shè)置在操作方法的執(zhí)行過程中發(fā)生的異常(如果有)。 |
| ExceptionHandled | bool | 獲取或設(shè)置一個值,該值指示是否處理異常。 |
| Result | ActionResult | 獲取或設(shè)置操作結(jié)果。 |
我們可以使用這兩個方法在Action方法返回結(jié)果前后進(jìn)行操作,具體操作的代碼我就不贅述了。
異常處理過濾器
異常處理過濾器需要實(shí)現(xiàn)的接口為IExceptionFilter。我們看下接口的定義:
//
// 摘要:
// 定義異常篩選器所需的方法。
public interface IExceptionFilter
{
//
// 摘要:
// 在發(fā)生異常時調(diào)用。
//
// 參數(shù):
// filterContext:
// 篩選器上下文。
void OnException(ExceptionContext filterContext);
}
接口方法OnException可以看到它在我們的方法中出現(xiàn)異常時觸發(fā),MVC默認(rèn)用HandleErrorAttribute類來實(shí)現(xiàn)了此接口,我們自己定義的異常過濾器可以繼承此類進(jìn)行擴(kuò)展。
OnException方法中傳遞的參數(shù)是一個ExceptionContext對象,它的屬性如下:
| 名稱 | 類型 | 說明 |
|---|---|---|
| Exception | Exception | 獲取或設(shè)置異常對象。 |
| ExceptionHandled | bool | 獲取或設(shè)置一個值,該值指示是否已處理異常。 |
| Result | ActionResult | 獲取或設(shè)置操作結(jié)果。 |
我們來定義一個異常過濾器,代碼如下:
public class MyExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//如果有異常,跳轉(zhuǎn)到異常頁面。
if (filterContext.Exception != null)
{
//跳轉(zhuǎn)到自定義的錯誤頁
ActionResult view = new ViewResult() { ViewName = "Error" };
filterContext.Result = view;
//異常處理結(jié)束后,一定要將ExceptionHandled設(shè)置為true,否則仍然會繼續(xù)拋出錯誤。
filterContext.ExceptionHandled = true;
}
}
}
當(dāng)我們的方法中出現(xiàn)異常時,會將Views文件夾下Shared中的Error.cshtml頁面返回到客戶端,客戶端頁面不再顯示成黃頁,給用戶一個良好的體驗(yàn)。
我們給Index方法添加上我們的異常處理器,再加一段引發(fā)異常的代碼看下效果。

打開Index視圖:

視圖中顯示的是Error頁面中的內(nèi)容。
通常我們用異常處理器來記錄我們的程序異常日志,或者在產(chǎn)生異常時給客戶端返回一個友好的提示內(nèi)容。
過濾器的使用方法
在上文的一些例子中,我們把過濾器的特性都定義在了Action方法上,其實(shí)過濾器不僅可以應(yīng)用在Action方法中,還可在應(yīng)用在Controller和全局配置中。
應(yīng)用在Controller中的使用方法和Action一致,在Controller類名上方添加特性標(biāo)簽即可。如圖:

全局環(huán)境下的過濾器,則需要注冊到FilterConfig文件中,例如MVC默認(rèn)給我們注冊的HandleErrorAttribute異常處理器:

并且我們可以注冊很多個過濾器在全局環(huán)境下,那么在此注冊的過濾器會應(yīng)用到整個應(yīng)用程序當(dāng)中。
總結(jié)
本章對過濾器的類型,作用,定義以及使用方法做了一些說明,當(dāng)然這些都是比較基礎(chǔ)的內(nèi)容,真正深入的理解還得多多使用,如果文章中有錯誤或者不足的地方,請大家在評論中指正出來。
-
控制器
+關(guān)注
關(guān)注
114文章
17562瀏覽量
189342 -
Asp.net
+關(guān)注
關(guān)注
0文章
36瀏覽量
14187 -
過濾器
+關(guān)注
關(guān)注
1文章
441瀏覽量
20790 -
MVC
+關(guān)注
關(guān)注
0文章
73瀏覽量
14325
發(fā)布評論請先 登錄
ASP.net Ajax開發(fā).zip
《ASP.net Ajax開發(fā)》初識ASP.NET AJAX.pdf
北大青鳥asp.net教程
Programming Microsoft ASP.NET
Asp.net中文手冊(CHM格式)
ASP.NET課程設(shè)計(jì)案例精編
Asp.net MVC框架自定義視圖引擎的實(shí)現(xiàn)
《ASP.NET 2.0網(wǎng)絡(luò)開發(fā)技術(shù)》 ASP.NET 2.0核
《ASP.NET 2.0網(wǎng)絡(luò)開發(fā)技術(shù)》 走進(jìn)ASP.NET 2.
過濾器的作用
ASP.NET MVC5教學(xué)之過濾器(上)

ASP.NET MVC5教學(xué)之過濾器(下)
評論