OnActionExecuted方法在Action操作方法調用之后執行,傳遞給OnActionExecuted方法的參數是ActionExecutedContext對象。這個類比ActionExecutingContext對象多了些屬性,如下:
名稱 | 類型 | 說明 |
---|---|---|
ActionDescriptor | ActionDescriptor | 獲取或設置操作描述符。 |
Canceled | bool | 獲取或設置一個值,該值指示此ActionExecutedContext 對象已被取消。 |
Exception | Exception | 獲取或設置在操作方法的執行過程中發生的異常(如果有)。 |
ExceptionHandled | bool | 獲取或設置一個值,該值指示是否處理異常。 |
Result | ActionResult | 獲取或設置由操作方法返回的結果。 |
我們可以通過OnActionExecuted方法來執行一些跨越動作方法的任務,比如我們可以用它來獲取動作方法執行的時間。我們修改 MyActionAttribute 過濾器代碼如下:
public class MyActionAttribute : ActionFilterAttribute
{
private Stopwatch timer;
///
/// Action調用之前運行
///
///
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
timer = Stopwatch.StartNew();
}
///
/// Action調用之后運行
///
///
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
timer.Stop();
filterContext.HttpContext.Response.Write($"方法執行時間:{timer.Elapsed.TotalSeconds:F6}s");
}
}
我們在方法啟動之前啟動了一個計時器,在方法執行后停止了它,并且將這個時間間隔輸出到我們的頁面上。重新編譯打開Index頁面,顯示如下:
結果過濾器
結果過濾器,顧名思義針對的是動作方法返回的結果,它在我們的動作方法結果返回前后執行。
創建結果過濾器需要實現IResultFilter接口。ActionFilterAttribute類幫我們實現了IResultFilter接口,我們可以直接繼承ActionFilterAttribute創建我們的過濾器,然后通過重寫OnResultExecutin和OnResultExecuting(在執行操作結果后調用)方法來實現過濾器規則。
OnResultExecuting方法會在執行操作結果前調用,這個方法的參數是一個ResultExecutingContext對象,屬性如下:
名稱 | 類型 | 說明 |
---|---|---|
Cancel | bool | 獲取或設置一個值,該值指示此 ResultExecutingContext 值是否為“cancel”。 |
Result | ActionResult | 獲取或設置操作結果。 |
OnResultExecuted方法在執行操作結果后調用,這個方法的參數是一個ResultExecutingContext對象,屬性如下:
名稱 | 類型 | 說明 |
---|---|---|
Canceled | bool | 獲取或設置一個值,該值指示此 ResultExecutingContext 值是否為“cancel”。 |
Exception | Exception | 獲取或設置在操作方法的執行過程中發生的異常(如果有)。 |
ExceptionHandled | bool | 獲取或設置一個值,該值指示是否處理異常。 |
Result | ActionResult | 獲取或設置操作結果。 |
我們可以使用這兩個方法在Action方法返回結果前后進行操作,具體操作的代碼我就不贅述了。
異常處理過濾器
異常處理過濾器需要實現的接口為IExceptionFilter。我們看下接口的定義:
//
// 摘要:
// 定義異常篩選器所需的方法。
public interface IExceptionFilter
{
//
// 摘要:
// 在發生異常時調用。
//
// 參數:
// filterContext:
// 篩選器上下文。
void OnException(ExceptionContext filterContext);
}
接口方法OnException可以看到它在我們的方法中出現異常時觸發,MVC默認用HandleErrorAttribute類來實現了此接口,我們自己定義的異常過濾器可以繼承此類進行擴展。
OnException方法中傳遞的參數是一個ExceptionContext對象,它的屬性如下:
名稱 | 類型 | 說明 |
---|---|---|
Exception | Exception | 獲取或設置異常對象。 |
ExceptionHandled | bool | 獲取或設置一個值,該值指示是否已處理異常。 |
Result | ActionResult | 獲取或設置操作結果。 |
我們來定義一個異常過濾器,代碼如下:
public class MyExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//如果有異常,跳轉到異常頁面。
if (filterContext.Exception != null)
{
//跳轉到自定義的錯誤頁
ActionResult view = new ViewResult() { ViewName = "Error" };
filterContext.Result = view;
//異常處理結束后,一定要將ExceptionHandled設置為true,否則仍然會繼續拋出錯誤。
filterContext.ExceptionHandled = true;
}
}
}
當我們的方法中出現異常時,會將Views文件夾下Shared中的Error.cshtml頁面返回到客戶端,客戶端頁面不再顯示成黃頁,給用戶一個良好的體驗。
我們給Index方法添加上我們的異常處理器,再加一段引發異常的代碼看下效果。
打開Index視圖:
視圖中顯示的是Error頁面中的內容。
通常我們用異常處理器來記錄我們的程序異常日志,或者在產生異常時給客戶端返回一個友好的提示內容。
過濾器的使用方法
在上文的一些例子中,我們把過濾器的特性都定義在了Action方法上,其實過濾器不僅可以應用在Action方法中,還可在應用在Controller和全局配置中。
應用在Controller中的使用方法和Action一致,在Controller類名上方添加特性標簽即可。如圖:
全局環境下的過濾器,則需要注冊到FilterConfig文件中,例如MVC默認給我們注冊的HandleErrorAttribute異常處理器:
并且我們可以注冊很多個過濾器在全局環境下,那么在此注冊的過濾器會應用到整個應用程序當中。
總結
本章對過濾器的類型,作用,定義以及使用方法做了一些說明,當然這些都是比較基礎的內容,真正深入的理解還得多多使用,如果文章中有錯誤或者不足的地方,請大家在評論中指正出來。
-
控制器
+關注
關注
112文章
16361瀏覽量
178071 -
Asp.net
+關注
關注
0文章
36瀏覽量
13862 -
過濾器
+關注
關注
1文章
429瀏覽量
19614 -
MVC
+關注
關注
0文章
73瀏覽量
13860
發布評論請先 登錄
相關推薦
評論