ASP.NET MVC的Action攔截器(過濾器)ActionFilter


有時項目要進行客戶端請求(action)進行攔截(過濾)驗證等業務,可以使用攔截器進行實現,所謂的action攔截器也沒有什么的,只是寫一個類,繼承另一個類(System.Web.Mvc.FilterAttribute)和一個接口(System.Web.Mvc.IActionFilter),至於什么是攔截器這里就不說了,網上很多關於這方面文章。

假如現在有這樣的一個需求:某個action需要登錄才能進行訪問,可以使用action屬性攔截器進行攔截進行驗證

多余的不說了直接上代碼

 寫一個攔截器類:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace AttributeDemo.Common
 8 {
 9     /// <summary>
10     /// Action攔截器
11     /// </summary>
12     public class ActionFilterAttribute : System.Web.Mvc.FilterAttribute, System.Web.Mvc.IActionFilter
13     {
14         #region 屬性
15         /// <summary>
16         /// 記錄是否登陸
17         /// </summary>
18         public bool IsLogin { get; set; }
19         #endregion
20 
21         #region 執行action后執行這個方法
22         /// <summary>
23         /// 執行action后執行這個方法
24         /// </summary>
25         /// <param name="filterContext"></param>
26         void System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
27         {
28 
29         }
30         #endregion
31 
32 
33         #region 執行action前執行這個方法 
34         /// <summary>
35         /// 執行action前執行這個方法
36         /// </summary>
37         /// <param name="filterContext"></param>
38         void System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
39         {
40 
41             if (!this.IsLogin)  //未登陸 重定向 到登陸頁面
42             {
43                 if (filterContext.HttpContext.Request.IsAjaxRequest())   //判斷是否ajax請求
44                 {
45 
46                     filterContext.Result = new System.Web.Mvc.JsonResult() { Data = new { statusCode = 301 }, ContentEncoding = System.Text.Encoding.UTF8, JsonRequestBehavior = JsonRequestBehavior.AllowGet, ContentType = "json" };
47                     return;
48                 }
49                 else  //驗證不通過
50                 {
51                     //filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { controller = "ActionFilterTest", action = "Login" }));  //重定向
52                     //filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }));   //重定向
53 
54                     //filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }));    //重定向
55 
56                     //filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }),true);  //重定向
57 
58                     filterContext.Result = new System.Web.Mvc.RedirectToRouteResult("MyRoute", new System.Web.Routing.RouteValueDictionary(new Dictionary<string, object>() { { "controller", "ActionFilterTest" }, { "action", "Login" } }), true);    //重定向
59                     return;
60                 }
61 
62             }
63 
64         }
65         #endregion
66 
67     }
68 }

請求的控制器類:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace AttributeDemo.Controllers
 8 {
 9     /// <summary>
10     /// 測試Action攔截器
11     /// </summary>
12     public class ActionFilterTestController : Controller
13     {
14         //
15         // GET: /ActionFilterTest/
16 
17         /// <summary>
18         /// 測試action攔截器
19         /// </summary>
20         /// <returns></returns>
21         [AttributeDemo.Common.ActionFilter(IsLogin = false)]
22         public ActionResult Test()
23         {
24             return View();
25         }
26 
27          
28         public ActionResult Login()
29         {
30             return View();
31         }
32 
33         [AttributeDemo.Common.ActionFilter(IsLogin = true)]
34         public ActionResult Index()
35         {
36             return View();
37         }
38     }
39 }

Global.asax類:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace AttributeDemo
 9 {
10     // 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明,
11     // 請訪問 http://go.microsoft.com/?LinkId=9394801
12 
13     public class MvcApplication : System.Web.HttpApplication
14     {
15         public static void RegisterGlobalFilters(GlobalFilterCollection filters)
16         {
17             filters.Add(new HandleErrorAttribute());
18         }
19 
20         public static void RegisterRoutes(RouteCollection routes)
21         {
22             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
23 
24             routes.MapRoute(
25                 "Default", // 路由名稱
26                 "{controller}/{action}/{id}", // 帶有參數的 URL
27                 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值
28             );
29             routes.MapRoute(
30                 "MyRoute", // 路由名稱
31                 "{controller}/{action}/{id}", // 帶有參數的 URL
32                 new { controller = "ActionFilterTest", action = "Login", id = UrlParameter.Optional } // 參數默認值
33             );
34         }
35 
36         protected void Application_Start()
37         {
38             AreaRegistration.RegisterAllAreas();
39 
40             RegisterGlobalFilters(GlobalFilters.Filters);
41             RegisterRoutes(RouteTable.Routes);
42         }
43     }
44 }

 注意:攔截器也可以寫在控制器類屬性上,寫在控制器類上表示攔截該控制器下所有action,如果寫在action只是攔截當前action有效

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace AttributeDemo.Controllers
{
    /// <summary>
    /// 測試Action攔截器
    /// </summary>
    [AttributeDemo.Common.ActionFilter(IsLogin = false)]
    public class ActionFilterTestController : Controller
    {
        //
        // GET: /ActionFilterTest/
    }
}

 


免責聲明!

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



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