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

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

在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());
        }
    }
複製代碼
複製代碼

 


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

更多相關文章
  • 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 的開發設計, ...
一周排行
  • 一:背景 1. 講故事 如果你常翻看FCL的源碼,你會發現這裡面有不少方法藉助了C/C++的力量讓C#更快更強悍,如下所示: [DllImport("QCall", CharSet = CharSet.Unicode)] [SecurityCritical] [SuppressUnmanagedCo ...
  • 上一篇(https://www.cnblogs.com/meowv/p/12966092.html)文章使用AutoMapper來處理對象與對象之間的映射關係,本篇主要圍繞定時任務和數據抓取相關的知識點並結合實際應用,在定時任務中迴圈處理爬蟲任務抓取數據。 開始之前可以刪掉之前測試用的幾個Hello ...
  • 首先創建實體類 1 public class MacState 2 { 3 /// <summary> 4 /// 請求狀態 5 /// </summary> 6 public string success { get; set; } 7 /// <summary> 8 /// 錯誤信息 9 /// ...
  • 0. 前言 前幾天FreeSql的作者向我推薦了FreeSql框架,想讓我幫忙寫個文章介紹一下。嗯,想不到我也能帶個貨了。哈哈,開個玩笑~看了下覺得設計的挺有意思的,所以就謝了這篇文章。 簡單介紹一下,FreeSql 是NCC組織的沙盒級項目,是一款功能強大的 ORM 組件,支持 .NET Core ...
  • 0. 前言 這是一個新的系列,名字是《ASP.NET Core 入門到實戰》。這個系列主講ASP.NET Core MVC,輔助一些前端的基礎知識(能用來實現我們需要的即可,並非主講)。同時這個系列也會在後續介紹ASP.NET Core 平臺的其它類型的項目,並帶領大家以各個類型的項目為主要架構開發 ...
  • 我寫了一個Winform測試程式,用的System.Timers.Timer,在事件里,設置label1.Text,然後,居然句柄泄漏、用戶對象泄漏! 百思不得其解,最後換成System.Windows.Forms.Timer,居然不泄漏了! 最近睡眠不足,哪怕一個很小的問題,隨便搞搞,都半夜了! ...
  • leetcode-7. 整數反轉。 給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21 註意: 假設環境只能存儲得下 32 位的有符號整數,則其 ...
  • 1. Java 虛擬機是什麼? 1.1 虛擬機 虛擬機:虛擬的電腦,一個用來執行虛擬電腦指令的軟體。 虛擬機分為系統虛擬機和程式虛擬機。 系統虛擬機:提供一個可運行完整操作系統的軟體平臺,如 Visual Box、VMware。 程式虛擬機:專門執行單個程式的,典型代表 Java 虛擬機。Jav ...
  • 前言 - strlen 概述 無意間掃到 glibc strlen.c 中代碼, 久久不能忘懷. 在一無所知的編程生涯中又記起點點滴滴: 編程可不是兒戲 ❀, 有些難, 也有些不捨. 隨軌跡一同重溫, 曾經最熟悉的 strlen 手感吧 ~ /* Copyright (C) 1991-2020 Fr ...
  • 背景 隊列[Queue]:是一種限定僅在表頭進行刪除操作,僅在表尾進行插入操作的線性表;即先進先出(FIFO-first in first out):最先插入的元素最先出來。 本文通過編碼實現鏈式隊列類,並模擬一個有趣的應用,能夠幫助我們對鏈式隊列有更深度的理解。 基本概念 結點 每個元素,除了存儲 ...