0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_78858299 ? 來源:python技術(shù)探秘一品文學(xué)閣 ? 作者:一品文學(xué)閣 ? 2023-03-29 11:20 ? 次閱讀

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)用之前運行
    /// 
    /// 
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        timer = Stopwatch.StartNew();
    }
    /// 
    /// Action調(diào)用之后運行
    /// 
    /// 
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        timer.Stop();
        filterContext.HttpContext.Response.Write($"方法執(zhí)行時間:{timer.Elapsed.TotalSeconds:F6}s");
    }
}

我們在方法啟動之前啟動了一個計時器,在方法執(zhí)行后停止了它,并且將這個時間間隔輸出到我們的頁面上。重新編譯打開Index頁面,顯示如下:

圖片

結(jié)果過濾器

結(jié)果過濾器,顧名思義針對的是動作方法返回的結(jié)果,它在我們的動作方法結(jié)果返回前后執(zhí)行。

創(chuàng)建結(jié)果過濾器需要實現(xiàn)IResultFilter接口。ActionFilterAttribute類幫我們實現(xiàn)了IResultFilter接口,我們可以直接繼承ActionFilterAttribute創(chuàng)建我們的過濾器,然后通過重寫OnResultExecutin和OnResultExecuting(在執(zhí)行操作結(jié)果后調(diào)用)方法來實現(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)行操作,具體操作的代碼我就不贅述了。

異常處理過濾器

異常處理過濾器需要實現(xiàn)的接口為IExceptionFilter。我們看下接口的定義:

//
// 摘要:
//     定義異常篩選器所需的方法。
public interface IExceptionFilter
{
    //
    // 摘要:
    //     在發(fā)生異常時調(diào)用。
    //
    // 參數(shù):
    //   filterContext:
    //     篩選器上下文。
    void OnException(ExceptionContext filterContext);
}

接口方法OnException可以看到它在我們的方法中出現(xiàn)異常時觸發(fā),MVC默認(rèn)用HandleErrorAttribute類來實現(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頁面返回到客戶端,客戶端頁面不再顯示成黃頁,給用戶一個良好的體驗。

我們給Index方法添加上我們的異常處理器,再加一段引發(fā)異常的代碼看下效果。

圖片

打開Index視圖:

圖片

視圖中顯示的是Error頁面中的內(nèi)容。

通常我們用異常處理器來記錄我們的程序異常日志,或者在產(chǎn)生異常時給客戶端返回一個友好的提示內(nèi)容。

過濾器的使用方法

在上文的一些例子中,我們把過濾器的特性都定義在了Action方法上,其實過濾器不僅可以應(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)容,真正深入的理解還得多多使用,如果文章中有錯誤或者不足的地方,請大家在評論中指正出來。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16384

    瀏覽量

    178336
  • Asp.net
    +關(guān)注

    關(guān)注

    0

    文章

    36

    瀏覽量

    13864
  • 過濾器
    +關(guān)注

    關(guān)注

    1

    文章

    430

    瀏覽量

    19630
  • MVC
    MVC
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    13877
收藏 人收藏

    評論

    相關(guān)推薦

    ASP.net Ajax開發(fā).zip

    ASP.net Ajax開發(fā).zip[hide][/hide]《ASP.net Ajax開發(fā)》AJAX Control Toolkit中的文本輸入處理《ASP.net Ajax開發(fā)》初識ASP
    發(fā)表于 06-19 21:26

    ASP.net Ajax開發(fā)》初識ASP.NET AJAX.pdf

    ASP.net Ajax開發(fā)》初識ASP.NET AJAX.pdf[hide][/hide]
    發(fā)表于 06-22 21:20

    北大青鳥asp.net教程

    北大青鳥asp.net教程.ASP.NET 和 Web 窗體 理解Web窗體和在B/S結(jié)構(gòu)中IIS的工作原理在ASP.NET應(yīng)用程序中使用可視化組件和  ASP.NET內(nèi)部對
    發(fā)表于 07-15 16:21 ?0次下載

    Programming Microsoft ASP.NET

    Programming Microsoft ASP.NET 3.5 ASP.NET pages are dynamically compiled on demand when first
    發(fā)表于 10-21 09:23 ?59次下載
    Programming Microsoft <b class='flag-5'>ASP.NET</b>

    Asp.net中文手冊(CHM格式)

    Asp.net中文手冊:第一篇 概論第一章 微軟.NET戰(zhàn)略和ASP.NET簡介第二章 .NET的安裝與運行環(huán)境第二篇 Web Form第一章 Web Form簡介(上)第一章 Web
    發(fā)表于 12-06 13:49 ?212次下載

    ASP.NET課程設(shè)計案例精編

    ASP.NET課程設(shè)計案例精編是一本全面講解ASP.NET編程方法和技巧的書,從ASP.NET的基本知識點入手,以ASP.NET網(wǎng)絡(luò)應(yīng)用為主,詳細(xì)講述了大量的編程實例。這些實例基
    發(fā)表于 01-07 16:14 ?144次下載
    <b class='flag-5'>ASP.NET</b>課程設(shè)計案例精編

    Asp.net MVC框架自定義視圖引擎的實現(xiàn)

    針對當(dāng)前Web 應(yīng)用系統(tǒng)層次不夠分明、結(jié)構(gòu)不夠清晰等不足,結(jié)合MVC 設(shè)計模式,實現(xiàn)了基于Asp.net MVC 框架的自定義視圖引擎,在顯示層將顯示邏輯與應(yīng)用邏輯相分離,將數(shù)據(jù)訪問
    發(fā)表于 01-15 14:13 ?36次下載

    ASP.NET 2.0網(wǎng)絡(luò)開發(fā)技術(shù)》 ASP.NET 2.0核

    ASP.NET 2.0網(wǎng)絡(luò)開發(fā)技術(shù)》 ASP.NET 2.0核心對象
    發(fā)表于 02-07 15:05 ?0次下載

    ASP.NET 2.0網(wǎng)絡(luò)開發(fā)技術(shù)》 走進(jìn)ASP.NET 2.

    ASP.NET 2.0網(wǎng)絡(luò)開發(fā)技術(shù)》 走進(jìn)ASP.NET 2.0
    發(fā)表于 02-07 15:11 ?0次下載

    ASP.net Ajax開發(fā)》初識ASP.NET AJAX

    ASP.net Ajax開發(fā)》初識ASP.NET AJAX
    發(fā)表于 02-07 15:11 ?0次下載

    ASP.net Ajax開發(fā)

    ASP.net Ajax開發(fā)
    發(fā)表于 02-16 00:10 ?0次下載

    過濾器的作用

    本視頻主要詳細(xì)介紹了過濾器的作用,分別是濾速高、過濾效果好;強度高、耐腐蝕;靜電作用;過濾物質(zhì);攔截;其次介紹了水龍頭過濾器的作用,最后介紹了活性炭
    的頭像 發(fā)表于 12-12 16:23 ?4.4w次閱讀

    過濾器藥液過濾器濾除率測試儀

    過濾器藥液過濾器濾除率測試儀
    的頭像 發(fā)表于 03-09 14:53 ?921次閱讀
    <b class='flag-5'>過濾器</b>藥液<b class='flag-5'>過濾器</b>濾除率測試儀

    ASP.NET MVC5教學(xué)之過濾器(上)

    MVC中的每一個請求,都會分配給相應(yīng)的控制器(Controller)和對應(yīng)的行為方法(Action)去處理,那么如果我們想要在Action處理的前后加上一些額外的處理邏輯怎么辦呢?這時候就用到了過濾器(Filters)。 在ASP
    的頭像 發(fā)表于 03-29 11:20 ?912次閱讀
    <b class='flag-5'>ASP.NET</b> <b class='flag-5'>MVC5</b><b class='flag-5'>教學(xué)</b><b class='flag-5'>之過濾器</b>(上)

    殺菌過濾器 滅菌過濾器 除菌過濾器

    殺菌過濾器 滅菌過濾器 除菌過濾器
    的頭像 發(fā)表于 03-03 14:03 ?2672次閱讀
    殺菌<b class='flag-5'>過濾器</b> 滅菌<b class='flag-5'>過濾器</b> 除菌<b class='flag-5'>過濾器</b>