1. 程式人生 > >【MVC-自定義過濾器】

【MVC-自定義過濾器】

APS.NET MVC中的每一個請求,都會分配給相應的控制器和對應的行為方法去處理,而在這些處理的前前後後如果想再加一些額外的邏輯處理。這時候就用到了過濾器。

自定義過濾器:

若要自定義一個過濾器,則要繼承ActionFilterAttribute類,這個類是一個抽象類,實現了IActionFilter和IResultFilter介面,主要通過重寫四個虛方法來達到在行為方法執行和返回的前後注入邏輯。

方法

引數

描述

OnActionExecuting

ActionExecutingContext

在行為方法執行前執行

OnActionExecuted

ActionExecutedContext

在行為方法執行後執行

OnResultExecuting

ResultExecutingContext

在行為方法返回前執行

OnResultExecuted

ResultExecutedContext

在行為方法返回後執行

我們新建一個MVC空專案,在根目錄下面新建資料夾Filter,存放我們的自定義過濾器,新增MyCustormFilter類,繼承ActionFilterAttribute並重寫裡面的虛方法,來滿足前前後後需要處理的邏輯問題。
    public class MyCustormFilter:ActionFilterAttribute
    {

        // 摘要: 
        //     在執行操作方法後由 ASP.NET MVC 框架呼叫。
        //
        // 引數: 
        //   filterContext:
        //     篩選器上下文。
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("OnActionExecuted > 在執行操作方法後由 ASP.NET MVC 框架呼叫<br/>");
            base.OnActionExecuted(filterContext);
        }
        //
        // 摘要: 
        //     在執行操作方法之前由 ASP.NET MVC 框架呼叫。
        //
        // 引數: 
        //   filterContext:
        //     篩選器上下文。
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("OnActionExecuting > 在執行操作方法之前由 ASP.NET MVC 框架呼叫<br/>");
            base.OnActionExecuting(filterContext);
        }
        //
        // 摘要: 
        //     在執行操作結果後由 ASP.NET MVC 框架呼叫。
        //
        // 引數: 
        //   filterContext:
        //     篩選器上下文。
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("OnResultExecuted > 在執行操作結果後由 ASP.NET MVC 框架呼叫<br/>");
            base.OnResultExecuted(filterContext);
        }
        //
        // 摘要: 
        //     在執行操作結果之前由 ASP.NET MVC 框架呼叫。
        //
        // 引數: 
        //   filterContext:
        //     篩選器上下文。
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("OnResultExecuting > 在執行操作結果之前由 ASP.NET MVC 框架呼叫<br/>");
            base.OnResultExecuting(filterContext);
        }
    }
我們新建Home控制器,並且新增Index檢視,在Home控制器的Index方法上加上過濾器,程式碼如下:
 public class HomeController : Controller
    {
        //
        // GET: /Home/
        [MyCustormFilter]
        public ActionResult Index()
        {
            return View();
        }
    }

過濾器經常用於許可權過濾,登入狀態控制過濾,異常處理過濾器。

自定義過濾器中的全域性過濾器:

修改Global.asax中的程式碼如下:


    // 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
    // 請訪問 http://go.microsoft.com/?LinkId=9394801
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
        //新增全域性過濾器
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new Filter.MyCustormFilter());
        }
    }
新增Son頁面,執行程式:在每一個控制器中執行的Action方法都先經過全域性過濾器。