MVC - 16.MVC过滤器
filter
- n. 滤波器;[化工] 过滤器;筛选;滤光器
- vt. 过滤;渗透;用过滤法除去
1.过滤器表
过滤器类型 |
接口 |
默认实现 |
描述 |
Action | IActionFilter | ActionFilterAttribute | 在动作方法之前及之后运行 |
Result | IResultFilter | ActionFilterAttribute | 在动作结果被执行之前和之后运行 |
AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先运行,在任何其它过滤器或动作方法之前 |
Exception | IExceptionFilter | HandleErrorAttribute | 只在另一个过滤器、动作方法、动作结果弹出异常时运行 |
2.Action
2.1.创建Action特性
自定义一个ActionFilterAttribute类,使他继承自 ActionFilterAttribute
public class MyActionFilterAttribute : ActionFilterAttribute
{
}
2.2. Action方法 过滤器 类
Filter/MyactionFilterAttribute.cs
Filter/MyactionFilterAttribute.cs /// <summary> /// Action方法 过滤器 类 /// </summary> public class MyActionFilterAttribute : ActionFilterAttribute { //执行Action方法之前 public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("执行Action方法之前 OnActionExecuting<br/>"); base.OnActionExecuting(filterContext); } //执行Action方法之后 public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("执行Action方法之后 OnActionExecuted"); base.OnActionExecuted(filterContext); } }
Controller/HomeController.cs
public class HomeController : Controller { // // GET: /Home/ [Filter.MyActionFilter] public ActionResult Index() { Response.Write(" index输出文字判断 <br/>"); return View(); } }
View/Index.cs
@{ ViewBag.Title = "Index"; } <h2>Index</h2> 我是Index页面,
2.3.全局Action特性
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); //添加全局 MyActionFilterAttribute filters.Add(new Filter.MyActionFilterAttribute()); } }
3.Reslut
3.1.Action方法 过滤器 类
Filter/YouResultFilterAtrribute.cs
Filter/YouResultFilterAtrribute.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace _16MVCFilter.Filter { /// <summary> /// Result 过滤器 - 加载的是视图 “Action” 方法的话,在加载视图前后调用 /// </summary> public class YouResultFilterAtrribute : ActionFilterAttribute { /// <summary> /// 加载“视图”前 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write("3.执行 Result “视图” 方法之前 OnActionExecuting<br/>"); base.OnResultExecuting(filterContext); } /// <summary> /// 加载“视图”后 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write("4.执行 Result “视图” 方法之后 OnActionExecuting<br/>"); base.OnResultExecuted(filterContext); } } }
3.2.特性使用
Controller/HomeController.cs
[Filter.MyActionFilter] [Filter.YouResultFilterAtrribute] public ActionResult Index() { Response.Write(" index输出文字判断 <br/>"); return View(); }
3.3.全局Result特性
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); //添加全局 MyActionFilterAttribute filters.Add(new Filter.MyActionFilterAttribute()); //添加全局 YOuResultFilterAttribute filters.Add(new Filter.YouResultFilterAtrribute()); } }
4.过滤器上下文里RouteData中获取url数据
RouteData
1.获取Action方法名,
2.Controller类名
3.area区域名
//执行Action方法之前 public override void OnActionExecuting(ActionExecutingContext filterContext) { //action 方法 string strAction = filterContext.RouteData.Values["action"].ToString(); //controller 类名 string strContoller = filterContext.RouteData.Values["controller"].ToString(); //RouteData.DataTokens["area"] 取得区域名称 string areaName = filterContext.RouteData.DataTokens["area"].ToString(); base.OnActionExecuting(filterContext); }
5.过滤器上下文里的补充-跳过Action方法(重要)
Controller/HomeController.cs
public class HomeController : Controller
{
//
// GET: /Home/
//[Filter.MyActionFilter]
//[Filter.YouResultFilterAtrribute]
[Filter.Hide]
public ActionResult Index()
{
Response.Write(" index输出文字判断 <br/>");
return View();
}
}
5.1.另外一种获取请求的 类名 和 方法名
5.2.检查被请求的方法 是否加了 Hide 特性(Attribute)
OnActionExecuting方法
OnActionExecuting方法 public override void OnActionExecuting(ActionExecutingContext filterContext) { #region 1.0.RouteData //action 方法 string strAction = filterContext.RouteData.Values["action"].ToString(); //contoller 类名 string strContoller = filterContext.RouteData.Values["controller"].ToString(); //RouteData.DataTokens["area"] 取得区域名称 //string areaName = filterContext.RouteData.DataTokens["area"].ToString(); //*{controller}/{action}/{id} string s = ((System.Web.Routing.Route)(filterContext.RouteData.Route)).Url; #endregion #region 2.0.另外一种获取请求的 类名 和 方法名 string strAction2 = filterContext.ActionDescriptor.ActionName; string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; #endregion #region 2.1.检查被请求的方法 是否加了 Hide 特性(Attribute) //2.1.检查被请求的方法 是否加了 Hide 特性(Attribute) if (filterContext.ActionDescriptor.IsDefined(typeof(Filter.Hide), false)) { //直接为请求 设置 返回结果 而不执行队形的 Action 方法,也不执行 OnActionExcuted,但是会执行 Result过滤器和生成视图 filterContext.Result = new ContentResult() { Content = "<br/>(11).后面直接跳过,!~~<br/>" }; } #endregion filterContext.HttpContext.Response.Write("(1).执行Action方法之前 OnActionExecuting<br/>"); base.OnActionExecuting(filterContext); }
看下图,执行后源代码对比,(5)使用hide特性不执行,执行(11),(2)onacgtionExrcuted不执行。
6.AuthorizeAttribute 授权过滤器
6.1.执行的位置
6.2.注释掉base.OnAuthorization,是因为我们不用ASP.NET授权验证,用自己的