OnActionExecuted方法在Action操作方法調(diào)用之后執(zhí)行,傳遞給OnActionExecuted方法的參數(shù)是ActionExecutedContext對(duì)象。這個(gè)類(lèi)比ActionExecutingContext對(duì)象多了些屬性,如下:
名稱(chēng) | 類(lèi)型 | 說(shuō)明 |
---|---|---|
ActionDescriptor | ActionDescriptor | 獲取或設(shè)置操作描述符。 |
Canceled | bool | 獲取或設(shè)置一個(gè)值,該值指示此ActionExecutedContext 對(duì)象已被取消。 |
Exception | Exception | 獲取或設(shè)置在操作方法的執(zhí)行過(guò)程中發(fā)生的異常(如果有)。 |
ExceptionHandled | bool | 獲取或設(shè)置一個(gè)值,該值指示是否處理異常。 |
Result | ActionResult | 獲取或設(shè)置由操作方法返回的結(jié)果。 |
我們可以通過(guò)OnActionExecuted方法來(lái)執(zhí)行一些跨越動(dòng)作方法的任務(wù),比如我們可以用它來(lái)獲取動(dòng)作方法執(zhí)行的時(shí)間。我們修改 MyActionAttribute 過(guò)濾器代碼如下:
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í)行時(shí)間:{timer.Elapsed.TotalSeconds:F6}s");
}
}
我們?cè)诜椒▎?dòng)之前啟動(dòng)了一個(gè)計(jì)時(shí)器,在方法執(zhí)行后停止了它,并且將這個(gè)時(shí)間間隔輸出到我們的頁(yè)面上。重新編譯打開(kāi)Index頁(yè)面,顯示如下:
結(jié)果過(guò)濾器
結(jié)果過(guò)濾器,顧名思義針對(duì)的是動(dòng)作方法返回的結(jié)果,它在我們的動(dòng)作方法結(jié)果返回前后執(zhí)行。
創(chuàng)建結(jié)果過(guò)濾器需要實(shí)現(xiàn)IResultFilter接口。ActionFilterAttribute類(lèi)幫我們實(shí)現(xiàn)了IResultFilter接口,我們可以直接繼承ActionFilterAttribute創(chuàng)建我們的過(guò)濾器,然后通過(guò)重寫(xiě)OnResultExecutin和OnResultExecuting(在執(zhí)行操作結(jié)果后調(diào)用)方法來(lái)實(shí)現(xiàn)過(guò)濾器規(guī)則。
OnResultExecuting方法會(huì)在執(zhí)行操作結(jié)果前調(diào)用,這個(gè)方法的參數(shù)是一個(gè)ResultExecutingContext對(duì)象,屬性如下:
名稱(chēng) | 類(lèi)型 | 說(shuō)明 |
---|---|---|
Cancel | bool | 獲取或設(shè)置一個(gè)值,該值指示此 ResultExecutingContext 值是否為“cancel”。 |
Result | ActionResult | 獲取或設(shè)置操作結(jié)果。 |
OnResultExecuted方法在執(zhí)行操作結(jié)果后調(diào)用,這個(gè)方法的參數(shù)是一個(gè)ResultExecutingContext對(duì)象,屬性如下:
名稱(chēng) | 類(lèi)型 | 說(shuō)明 |
---|---|---|
Canceled | bool | 獲取或設(shè)置一個(gè)值,該值指示此 ResultExecutingContext 值是否為“cancel”。 |
Exception | Exception | 獲取或設(shè)置在操作方法的執(zhí)行過(guò)程中發(fā)生的異常(如果有)。 |
ExceptionHandled | bool | 獲取或設(shè)置一個(gè)值,該值指示是否處理異常。 |
Result | ActionResult | 獲取或設(shè)置操作結(jié)果。 |
我們可以使用這兩個(gè)方法在Action方法返回結(jié)果前后進(jìn)行操作,具體操作的代碼我就不贅述了。
異常處理過(guò)濾器
異常處理過(guò)濾器需要實(shí)現(xiàn)的接口為IExceptionFilter。我們看下接口的定義:
//
// 摘要:
// 定義異常篩選器所需的方法。
public interface IExceptionFilter
{
//
// 摘要:
// 在發(fā)生異常時(shí)調(diào)用。
//
// 參數(shù):
// filterContext:
// 篩選器上下文。
void OnException(ExceptionContext filterContext);
}
接口方法OnException可以看到它在我們的方法中出現(xiàn)異常時(shí)觸發(fā),MVC默認(rèn)用HandleErrorAttribute類(lèi)來(lái)實(shí)現(xiàn)了此接口,我們自己定義的異常過(guò)濾器可以繼承此類(lèi)進(jìn)行擴(kuò)展。
OnException方法中傳遞的參數(shù)是一個(gè)ExceptionContext對(duì)象,它的屬性如下:
名稱(chēng) | 類(lèi)型 | 說(shuō)明 |
---|---|---|
Exception | Exception | 獲取或設(shè)置異常對(duì)象。 |
ExceptionHandled | bool | 獲取或設(shè)置一個(gè)值,該值指示是否已處理異常。 |
Result | ActionResult | 獲取或設(shè)置操作結(jié)果。 |
我們來(lái)定義一個(gè)異常過(guò)濾器,代碼如下:
public class MyExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//如果有異常,跳轉(zhuǎn)到異常頁(yè)面。
if (filterContext.Exception != null)
{
//跳轉(zhuǎn)到自定義的錯(cuò)誤頁(yè)
ActionResult view = new ViewResult() { ViewName = "Error" };
filterContext.Result = view;
//異常處理結(jié)束后,一定要將ExceptionHandled設(shè)置為true,否則仍然會(huì)繼續(xù)拋出錯(cuò)誤。
filterContext.ExceptionHandled = true;
}
}
}
當(dāng)我們的方法中出現(xiàn)異常時(shí),會(huì)將Views文件夾下Shared中的Error.cshtml頁(yè)面返回到客戶(hù)端,客戶(hù)端頁(yè)面不再顯示成黃頁(yè),給用戶(hù)一個(gè)良好的體驗(yàn)。
我們給Index方法添加上我們的異常處理器,再加一段引發(fā)異常的代碼看下效果。
打開(kāi)Index視圖:
視圖中顯示的是Error頁(yè)面中的內(nèi)容。
通常我們用異常處理器來(lái)記錄我們的程序異常日志,或者在產(chǎn)生異常時(shí)給客戶(hù)端返回一個(gè)友好的提示內(nèi)容。
過(guò)濾器的使用方法
在上文的一些例子中,我們把過(guò)濾器的特性都定義在了Action方法上,其實(shí)過(guò)濾器不僅可以應(yīng)用在Action方法中,還可在應(yīng)用在Controller和全局配置中。
應(yīng)用在Controller中的使用方法和Action一致,在Controller類(lèi)名上方添加特性標(biāo)簽即可。如圖:
全局環(huán)境下的過(guò)濾器,則需要注冊(cè)到FilterConfig文件中,例如MVC默認(rèn)給我們注冊(cè)的HandleErrorAttribute異常處理器:
并且我們可以注冊(cè)很多個(gè)過(guò)濾器在全局環(huán)境下,那么在此注冊(cè)的過(guò)濾器會(huì)應(yīng)用到整個(gè)應(yīng)用程序當(dāng)中。
總結(jié)
本章對(duì)過(guò)濾器的類(lèi)型,作用,定義以及使用方法做了一些說(shuō)明,當(dāng)然這些都是比較基礎(chǔ)的內(nèi)容,真正深入的理解還得多多使用,如果文章中有錯(cuò)誤或者不足的地方,請(qǐng)大家在評(píng)論中指正出來(lái)。
-
控制器
+關(guān)注
關(guān)注
114文章
17116瀏覽量
184438 -
Asp.net
+關(guān)注
關(guān)注
0文章
36瀏覽量
14091 -
過(guò)濾器
+關(guān)注
關(guān)注
1文章
439瀏覽量
20404 -
MVC
+關(guān)注
關(guān)注
0文章
73瀏覽量
14141
發(fā)布評(píng)論請(qǐng)先 登錄
ASP.net Ajax開(kāi)發(fā).zip
《ASP.net Ajax開(kāi)發(fā)》初識(shí)ASP.NET AJAX.pdf
北大青鳥(niǎo)asp.net教程
Programming Microsoft ASP.NET

Asp.net中文手冊(cè)(CHM格式)
ASP.NET課程設(shè)計(jì)案例精編

Asp.net MVC框架自定義視圖引擎的實(shí)現(xiàn)
《ASP.NET 2.0網(wǎng)絡(luò)開(kāi)發(fā)技術(shù)》 ASP.NET 2.0核
《ASP.NET 2.0網(wǎng)絡(luò)開(kāi)發(fā)技術(shù)》 走進(jìn)ASP.NET 2.
《ASP.net Ajax開(kāi)發(fā)》初識(shí)ASP.NET AJAX
過(guò)濾器的作用
ASP.NET MVC5教學(xué)之過(guò)濾器(上)

評(píng)論