有時項目要進行客戶端請求(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/ } }
