笨鳥先飛之ASP.NET MVC系列之過濾器(03動作過濾器過濾器)


概念介紹

動作過濾器應該是我們平常工作中需要用到最多的過濾器了,動作過濾器,主要在我們的動作方法執行前后執行。

如果我們需要創建動作過濾器需要實現IActionFilter接口。

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

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

OnActionExecuting方法

我們已經知道了OnActionExecuting方法實在動作方法調用之前被,調用的那么我們就可以利用這個方法來檢測請求,並且可以在這里修改請求,取消請求,在OnActionExecuting方法中傳遞的參數是一個ActionExecutingContext對象,它繼承於ControllerContext類,它的屬性如下:

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

執行OnActionExecuting方法

下面我將演示OnActionExecuting方法,首先我們還是在之前的Filter文件夾下添加一個名為 CustomActionAttribute.cs 的過濾器類,我們繼承 FilterAttribute 類和 IActionFilter 接口,為了方便演示,我們簡單處理,判斷請求類型,如果是GET請求那么我們讓其拋出404錯誤。

這是我們在 CustomActionAttribute.cs 文件中編寫的代碼

public class CustomActionAttribute : FilterAttribute, IActionFilter
    {

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "get", StringComparison.CurrentCultureIgnoreCase))
            {
                filterContext.Result = new HttpNotFoundResult();
            }
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }

    }

因為創建動作過濾器需要實現IActionFilter接口中的兩個方法,如果不需要實現邏輯我們可以先讓其空着,因為MVC框架對動作過濾器中的兩個方法都會調用。

接着我們在Home控制器里添加一個方法方法會直接在頁面輸出“執行方法”這幾個字,接着我們在方法上應用,我們的動作過濾器

        [CustomAction]
        public ActionResult GetText()
        {
            ViewBag.Message = "執行方法";

            return View();
        }

好了我們允許程序,並且在瀏覽器里直接請求我們這個方法,我們看看效果

OnActionExecuted方法

OnActionExecuted方法在動作方法執行后調用,傳遞給OnActionExecuted方法的參數是ActionExecutedContext對象。這個類相比我們之前的ActionExecutingContext對象而言多了些屬性,它的屬性如下:

名稱 類型 說明
ActionDescriptor ActionDescriptor 獲取或設置操作描述符。
Canceled bool 獲取或設置一個值,該值指示此ActionExecutedContext 對象已被取消。
Exception Exception 獲取或設置在操作方法的執行過程中發生的異常(如果有)。
ExceptionHandled bool 獲取或設置一個值,該值指示是否處理異常。
Result ActionResult 獲取或設置由操作方法返回的結果。

執行OnActionExecuted方法

我們可以通過OnActionExecuted方法來執行一些跨越動作方法的任務,比如我們可以用它來獲取動作方法執行的時間。我們修改 CustomActionAttribute.cs 過濾器代碼如下:

public class CustomActionAttribute : FilterAttribute, IActionFilter
    {
        private Stopwatch timer;

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
 
            timer = Stopwatch.StartNew();
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            timer.Stop();
            if (filterContext.Exception == null)
            {
                filterContext.HttpContext.Response.Write($"<div>方法執行時間:{timer.Elapsed.TotalSeconds:F6}s</div>");
            }
        }

    }

我們在方法啟動之前啟動了一個計時器並在方法執行后停止了它,並且將這個時間間隔輸出到我們的頁面上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM