MVC過濾器詳解和示例

MVC過濾器一共分爲四個:ActionFilter(方法過濾器),ResultFilter(結果過濾器,感覺不是很好聽,就這樣叫吧),AuthorizationFilter(授權過濾器),ExceptionFilter(異常處理過濾器)

過濾器類型 接口 默認實現 描述
Action IActionFilter ActionFilterAttribute 在動作方法之前及之後運行
Result IResultFilter ActionFilterAttribute 在動作結果被執行之前和之後運行
AuthorizationFilter IAuthorizationFilter AuthorizeAttribute 首先運行,在任何其它過濾器動作方法之前運行
Exception IExceptionFilter HandleErrorAttribute 只在另外一個過濾器,動作方法,動作結果彈出異常時運行


示例:Action方法過濾器

/// <summary>
    /// Action方法 過濾器 類
    /// </summary>
    public class MyActionFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 在  Action方法之前 調用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //1. RouteData 中 保存了 當前請求 匹配的 路由信息和路由對象
            //             如果本次請求 是請求了某個 區域 裏的 控制器方法,還可以通過filterContext.RouteData.DataTokens["area"]獲取區域名

            //string strArea = filterContext.RouteData.DataTokens["area"].ToString();
            string strController = filterContext.RouteData.Values["controller"].ToString();
            string strAction = filterContext.RouteData.Values["action"].ToString();
            //filterContext.RouteData.GetRequiredString

            //2.另一種方式 獲取 請求的 類名和方法名
            string strAction2 = filterContext.ActionDescriptor.ActionName;
            string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

            //2.1檢查 被請求方法 是否 加了 MoneyAttribute 特性
            if (filterContext.ActionDescriptor.IsDefined(typeof(Filters.MoneyAttribute), false))
            {
                //直接爲 請求 設置 返回結果,而不執行 對應的 Action 方法,也不執行 OnActionExcuted,但是,會執行 Result過濾器和 生成視圖
                filterContext.Result = new ContentResult() { Content = "<br/>哈哈哈,直接被跳過了吧~~~!<br/>" };
            }   

            filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuting<br/>");
            base.OnActionExecuting(filterContext);
        }

        /// <summary>
        /// 在  Action方法之後 調用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuted<br/>");
            base.OnActionExecuted(filterContext);
        }

使用方法1:將過濾器加到方法上

 [Filters.MyActionFilter]//1.將 過濾器 加到方法上
        [Filters.Money]
        [Filters.MyResultFilter]
        [Filters.MyAuthorize]
        public ActionResult Index()
        {
            Response.Write("Index 方法<br/>");
            ViewBag.name = "時間:" + DateTime.Now;
            return View();
        }

使用方法2:將過濾器加到方類上

[Filters.MyActionFilter]
    public class HomeController : Controller
    {
    }

使用方法3:添加全局過濾器,即添加到FilterConfig.cs中

 public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());

            //3. 添加全局過濾器
            filters.Add(new Filters.MyActionFilterAttribute());

            filters.Add(new Filters.MyHandleErrorAttribute());
        }
    }


示例:Result過濾器

 /// <summary>
    /// Result 過濾器 類 - 如果請求的是 要加載視圖的 Action 方法的話
    ///                   在 視圖加載 前 後 調用方法
    /// </summary>
    public class MyResultFilterAttribute:System.Web.Mvc.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);
        }
    }

示例:授權過濾器 - 在 Action過濾器前 執行

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

示例:Exception過濾器

/// <summary>
    /// 異常處理 過濾器
    /// </summary>
    public class MyHandleErrorAttribute : 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);
        }
    }




發佈了71 篇原創文章 · 獲贊 8 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章