精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

什么是過濾器?

MVC中的每一個請求,都會分配給相應的控制器(Controller)和對應的行為方法(Action)去處理,那么如果我們想要在Action處理的前后加上一些額外的處理邏輯怎么辦呢?這時候就用到了過濾器(Filters)。

在ASP.NET MVC的請求處理過程中有19個管道事件,這些事件分布在請求處理的各個節點中,比如BeginRequest(開始處理請求時觸發)、AuthenticateRequest(對請求進行身份驗證時觸發)、AuthorizeRequest(對請求進程授權時觸發)…等等等等。而過濾器的主要作用就是將我們的附加邏輯注入到這些請求處理管道中。

在實際業務中,在Action方法前后添加額外附加邏輯的情況有很多,過濾器就是用來完成此功能。通過過濾器可以將與業務邏輯無關但經常需要執行的代碼分離開,使我們的代碼邏輯性更加清晰,代碼更加簡潔。

過濾器的類型與作用

MVC給我們提供了四種過濾器,基本滿足了我們實際業務中常用的需求,包括以下:

類型名稱 實現的接口 默認的實現類 作用
授權過濾器 IAuthorizationFilter AuthorizeAttribute 用于限制進入控制器或控制器的某個行為方法
動作過濾器 IActionFilter ActionFilterAttribute 用于進入動作方法之前或之后的處理
結果過濾器 IResultFilter ActionFilterAttribute 用于動作方法返回結果之前或之后的處理
異常處理過濾器 IExceptionFilter HandleErrorAttribute 用于處理某個動作方法或某個控制器里面拋出的異常

這四種類型的接口是MVC對過濾器的一個接口規范,同時MVC默認通過AuthorizeAttribute(授權)、HandleErrorAttribute(異常處理)、ActionFilterAttribute(動作和結果)三個類實現了這四個接口。

需要注意的是ActionFilterAttribute類既實現了IActionFilter接口,也實現了IResultFilter接口。這是個抽象類,要求必須提供一個實現,AuthorizeAttribute和HandleErrorAttribute類則包含了一些有用的特性,可以不必創建派生類進行使用。所以我們一般都會通過繼承ActionFilterAttribute類,實現自定義的過濾器。

除以上接口之外,我們還要用到FilterAttribute類,這個類將我們的過濾器包裝成了特性,使我們的過濾器可以方便的在Action方法上方使用。

定義過濾器

過濾器有以下幾個特點:

  • 可用于動作方法(Action)
  • 可用于控制器(Controller)
  • 可多個Filter可同時使用
  • 不同級別可以混搭
  • 可運用于基類的過濾器,會影響該基類的所有派生類

下面我們逐一介紹下基本過濾器的使用方法。

授權過濾器

所有實現了IAuthorizationFilter接口的都可以稱之為授權過濾器。它的接口定義如下:

namespace System.Web.Mvc
{
    //
    // 摘要:
    //     定義授權篩選器所需的方法。
    public interface IAuthorizationFilter
    {
        //
        // 摘要:
        //     在需要授權時調用。
        //
        // 參數:
        //   filterContext:
        //     篩選器上下文。
        void OnAuthorization(AuthorizationContext filterContext);
    }
}

授權過濾器是最先運行的過濾器,它運行在其它過濾器和Action方法之前。客戶端請求在調用Action之前,MVC框架會檢測Action上是否有授權過濾器,如果有會調用OnAuthorization方法,如果此方法批準了請求,才會調用相應的Action。流程如圖:

圖片

MVC默認使用AuthorizeAttribute實現了IAuthorizationFilter接口,所以我們可以在Action方法上直接添加Authorize特性標簽來驗證授權:

圖片

打開Index頁面,會顯示無權限:

圖片

由于使用的是MVC自帶的授權驗證方法,未能符合它的驗證機制,所以無權限查看。通常我們需要添加一個新的派生自AuthorizeAttribute類的授權過濾器來完成我們自己業務邏輯。

下面我們自定義一個授權過濾器。我們在MVC項目中添加一個Filters文件夾,我們所有自定義的過濾器都放可以到這個文件夾下,便于管理。

在Filters下創建一個類,類名為MyAuthorizeAttribute。需要注意,過濾器要以Attribute結尾,這是MVC的約定。代碼如下:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    //重寫授權檢查方法,返回值為true,允許訪問,false,禁止訪問。
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        //請求參數user為空,禁止訪問
        if (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["user"]))
        {
            return false;
        }
        return true;
    }
}

可以看到,我們只要重寫AuthorizeCore方法就可以根據我們的業務需求判斷是否有權限訪問,返回值為true允許訪問,返回值為false禁止訪問。

回到HomeController,我們給About方法加上我們自定義的特性:

圖片

我們看看效果:

圖片

可以看到,當About頁面沒有user參數時,會提示無權限,有user參數則可以訪問通過。

在實際業務中我們可以使用授權過濾器來管理用戶登錄狀態的授權驗證。當然,我的這個例子只是基礎的用法,實際業務比這復雜的多,那么就需要我們自己去思考設計授權過濾器方法了。

動作過濾器

動作過濾器需要實現IActionFilter接口,接口定義如下:

//
// 摘要:
//     定義操作篩選器中使用的方法。
public interface IActionFilter
{
    //
        // 摘要:
        //     在執行操作方法后調用。
        //
        // 參數:
        //   filterContext:
        //     篩選器上下文。
        void OnActionExecuted(ActionExecutedContext filterContext);
    //
        // 摘要:
        //     在執行操作方法之前調用。
        //
        // 參數:
        //   filterContext:
        //     篩選器上下文。
        void OnActionExecuting(ActionExecutingContext filterContext);
}

我們看到該接口里有兩個方法OnActionExecuting和OnActionExecuted,前者在動作方法執行前調用,后者在動作方法執行后調用。

OnActionExecuting方法是在Action方法執行前調用的,那么我們可以利用這個方法來檢測請求,并且可以在這里修改請求,取消請求等等操作。

客戶端的請求信息是一個ActionExecutingContext對象,它繼承自ControllerContext類,屬性如下:

名稱 類型 說明
ActionDescriptor ActionDescriptor 獲取或設置操作描述符。
ActionParameters IDictionary 獲取或設置操作方法參數。
Result ActionResult 獲取或設置由操作方法返回的結果。

我們添加一個自定義的Action過濾器。由于ActionFilterAttribute類實現了IActionFilter接口,所以我們直接繼承ActionFilterAttribute類即可,并且重寫OnActionExecuting和OnActionExecuted方法。如下:

public class MyActionAttribute : ActionFilterAttribute
{
    /// 
    /// Action調用之前運行
    /// 
    /// 
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "get", StringComparison.CurrentCultureIgnoreCase))
        {
            filterContext.Result = new HttpNotFoundResult("只允許POST請求!");
        }
    }
    /// 
    /// Action調用之后運行
    /// 
    /// 
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {


    }
}

我們給Index方法添加上MyAction特性標簽:

圖片

打開Index頁,顯示如下:

圖片

可以看到,頁面返回了404錯誤,提示信息為我們設置的Message。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Controller
    +關注

    關注

    0

    文章

    397

    瀏覽量

    57076
  • Asp.net
    +關注

    關注

    0

    文章

    36

    瀏覽量

    13844
  • 過濾器
    +關注

    關注

    1

    文章

    427

    瀏覽量

    19557
  • MVC
    MVC
    +關注

    關注

    0

    文章

    73

    瀏覽量

    13841
收藏 人收藏

    評論

    相關推薦

    ASP.net Ajax開發.zip

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

    ASP.net Ajax開發》初識ASP.NET AJAX.pdf

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

    北大青鳥asp.net教程

    北大青鳥asp.net教程.ASP.NET 和 Web 窗體 理解Web窗體和在B/S結構中IIS的工作原理在ASP.NET應用程序中使用可視化組件和  ASP.NET內部對
    發表于 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
    發表于 10-21 09:23 ?59次下載
    Programming Microsoft <b class='flag-5'>ASP.NET</b>

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

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

    ASP.NET課程設計案例精編

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

    Asp.net MVC框架自定義視圖引擎的實現

    針對當前Web 應用系統層次不夠分明、結構不夠清晰等不足,結合MVC 設計模式,實現了基于Asp.net MVC 框架的自定義視圖引擎,在顯示層將顯示邏輯與應用邏輯相分離,將數據訪問
    發表于 01-15 14:13 ?36次下載

    ASP.NET 2.0網絡開發技術》 ASP.NET 2.0核

    ASP.NET 2.0網絡開發技術》 ASP.NET 2.0核心對象
    發表于 02-07 15:05 ?0次下載

    ASP.NET 2.0網絡開發技術》 走進ASP.NET 2.

    ASP.NET 2.0網絡開發技術》 走進ASP.NET 2.0
    發表于 02-07 15:11 ?0次下載

    ASP.net Ajax開發》初識ASP.NET AJAX

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

    ASP.net Ajax開發

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

    過濾器的作用

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

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

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

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

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

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

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