ASP.NET MVC中有四種過濾器類型

来源:https://www.cnblogs.com/haixiong/archive/2020/03/29/12595549.html
-Advertisement-
Play Games

在ASP.NET MVC中有四種過濾器類型 Action 1、在ASP.NET MVC項目中,新建文件夾Filter,然後新建類MyCustormFilter,繼承自ActionFilterAttribute類,我們來看下ActionFilterAttribute類有如下四個方法,從命名我應該就可以 ...


在ASP.NET MVC中有四種過濾器類型

 Action

1、在ASP.NET MVC項目中,新建文件夾Filter,然後新建類MyCustormFilter,繼承自ActionFilterAttribute類,我們來看下ActionFilterAttribute類有如下四個方法,從命名我應該就可以看出他們的執行時機。

複製代碼 複製代碼
  public class MyCustormFilter:ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("Action執行前");
            base.OnActionExecuting(filterContext);
        }
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("Action執行後");
            base.OnActionExecuted(filterContext);
        }
    }
複製代碼 複製代碼

2、對於過濾器,我們可以把它們加在三個地方,一個是控制器上面(控制器下麵的所有Action),一個是Action上面(指定標識的Action),另一個就是全局位置(所有控制器中的Action)。這裡我只演示在Action上面加

複製代碼 複製代碼
       [MyCustormFilter]
        public ActionResult Index()
        {
            return View();
        }
       public ActionResult Index1()
       {
           return View();
}   
複製代碼 複製代碼

3、build然後運行

Result

 1、新建類TestResultFilter,繼承ActionFilterAttribute

複製代碼 複製代碼
  public class TestResultFilter:ActionFilterAttribute
    {
        /// <summary>
        /// 載入 "視圖" 前執行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("載入視圖前執行 OnResultExecuting <br/>");
            base.OnResultExecuting(filterContext);
        }

        /// <summary>
        /// 載入"視圖" 後執行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("載入視圖後執行 OnResultExecuted <br/>");
            base.OnResultExecuted(filterContext);
        }
    }
複製代碼 複製代碼

2、這裡我把TestResultFilter過濾器加在控制器上面

複製代碼 複製代碼
  [TestResultFilter]
    public class FilterTestController : Controller
    {
       [MyCustormFilter]
        public ActionResult Index()
        {
            return View();
        }
       public ActionResult Index1()
       {
           return View();
       }
    }
複製代碼 複製代碼

3、運行看下結果

註意:Result過濾器,無論Action的返回類型為什麼(甚至void)都將執行。

RouteData中保存了當前請求匹配的路由信息和路由對象

修改MyCustormFilter.cs

複製代碼 複製代碼
 public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //1.獲取獲取請求的類名和方法名
            string strController = filterContext.RouteData.Values["controller"].ToString();
            string strAction = filterContext.RouteData.Values["action"].ToString();//2.另一種方式 獲取請求的類名和方法名
            string strAction2 = filterContext.ActionDescriptor.ActionName;
            string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

            filterContext.HttpContext.Response.Write("Action執行前</br>");
            filterContext.HttpContext.Response.Write("控制器:" + strController + "</br>");
            filterContext.HttpContext.Response.Write("控制器:" + strController2+"</br>");
            filterContext.HttpContext.Response.Write("Action:" + strAction + "</br>");
            filterContext.HttpContext.Response.Write("Action:" + strAction2 + "</br>");
            base.OnActionExecuting(filterContext);
        }
複製代碼 複製代碼

 

AuthorizeAttribute

1、  新建TestAuthorizeAttribute

複製代碼 複製代碼
    /// <summary>
    /// 授權過濾器 --在Action過濾器前執行
    /// </summary>
    public class TestAuthorizeAttribute:AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Write("<br/>OnAuthorization<br/>");
            //註釋掉父類方法,因為父類里的 OnAuthorization 方法會調用asp.net的授權驗證機制!
            //base.OnAuthorization(filterContext);
        }
}
複製代碼 複製代碼

2、在控制器FilterTest中的Index上添加TestAuthorize標記

複製代碼 複製代碼
       [MyCustormFilter]
       [TestAuthorize]
        public ActionResult Index()
        {
            return View();
        }
複製代碼 複製代碼

運行看下結果:

Exception

1、新建TestHandleError.cs

複製代碼 複製代碼
    /// <summary>
    /// 異常處理 過濾器
    /// </summary>
    public class TestHandleError : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            //1.獲取異常對象
            Exception ex = filterContext.Exception;
            //2.記錄異常日誌
            //3.重定向友好頁面
            filterContext.Result = new RedirectResult("~/error.html");
            //4.標記異常已經處理完畢
            filterContext.ExceptionHandled = true;

            base.OnException(filterContext);
        }
    }
複製代碼 複製代碼

2、在Action上面加TestHandleError

複製代碼 複製代碼
  [TestHandleError]
       public ActionResult GetErr()
       {
           int a = 0;
           int b = 1 / a;
           return View();
       }
複製代碼 複製代碼

註意:通常這樣的異常處理我們是放在全局過濾器上面的。

複製代碼 複製代碼
   public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            //添加全局過濾器
            filters.Add(new TestHandleError());
        }
    }
複製代碼 複製代碼

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 uses 2 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 3 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBa ...
  • Druid簡介 Druid是阿裡開源的資料庫連接池,作為後起之秀,性能比dbcp、c3p0更高,使用也越來越廣泛。 druid的優點 高性能。性能比dbcp、c3p0高很多。 只要是jdbc支持的資料庫,druid都支持,對資料庫的支持性好。並且Druid針對oracle、mysql做了特別優化。 ...
  • public static <T> T map2Object(Map<String, Object> map, Class<T> clazz) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (map ...
  • A - Coffee 題意:給你一個字元串,要你判斷是否滿足一下條件,全部滿足則輸出“Yes”,否則輸出“No”。 (1)字元串的第3個字母等於字元串的第4個字母 (2)字元串的第5個字母等於字元串的第6個字母 (3)字元串的長度為6,且全部為小寫字母 題解:簽到題,易解 代碼: #include< ...
  • 一、背景 一方面,有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方法。但是,Java不支持多重繼承。有了介面,就可以得到多重繼承的效果。 另一方面,有時必須從幾個類中抽取出一些共同的行為特征,而它們之間又沒有is-a的關係,僅僅是具有相同的行為特征而已。 二、圖示 三、介面的使用 1.介面: ...
  • 隨著繼承層次中一個個新子類的定義,類變得越來越具體,而父類則更一般,更通用。類的設計應該保證父類和子類能夠共用特征。有時將一個父類設計得非常抽象,以至於它沒有具體的實例,這樣的類叫做抽象類。 舉例: public class test { public static void main(String ...
  • 發現按照教程操作破解Eplan,破解一直不成功。主要原因是MultiKey64在win10上運行不成功。可以通過設備管理看到是否有下圖的驅動 需要關閉win10的簽名認證,這個鏈接就是關閉的方法https://jingyan.baidu.com/article/624e74594dbc8d34e8b ...
  • 你需要瞭解的 HTTP Status Code Intro 現在前後端分離的開發模式越來越流行,後端負責開發對應的 API,前端只需要 關註前端頁面的數據展示和前端邏輯即可。 對於前後端分離這種開發模式,我個人還是比較喜歡的,因為這樣可以讓更專業的人做更專業的事情,後端專註於做 API 的開發設計, ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...