MVC 过滤器
一、为什么使用过滤器:
APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。
二、MVC支持的过滤器:
分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)
过滤器类型 |
接口 |
描述 |
Authorization |
IAuthorizationFilter |
此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法 |
Exception |
IExceptionFilter |
用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 |
Action |
IActionFilter |
用于进入行为之前或之后的处理 |
Result |
IResultFilter |
用于返回结果的之前或之后的处理 |
但是默认实现它们的过滤器只有三种,分别是Authorize(授权),ActionFilter,HandleError(错误处理);各种信息如下表所示
过滤器 |
类名 |
实现接口 |
描述 |
ActionFilter |
AuthorizeAttribute |
IAuthorizationFilter |
此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法 |
HandleError |
HandleErrorAttribute |
IExceptionFilter |
用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常 |
自定义 |
ActionFilterAttribute |
IActionFilter和IResultFilter |
用于进入行为之前或之后的处理或返回结果的之前或之后的处理 |
自定义过滤器的基本使用实例:
万一前面介绍的过滤器也满足不了需求,要在行为方法执行返回的前前后后定义自己的处理逻辑的话,这个自定义过滤器就应该能派上用场了。若要自定义一个过滤器 则要继承ActionFilterAttribute类,这个类是一个抽象类,实现了IActionFilter和IResultFilter接口,主要通过重写四个虚方法来达到在行为方法执行和返回的前后注入逻辑
方法 |
参数 |
描述 |
OnActionExecuting |
ActionExecutingContext |
在行为方法执行前执行 |
OnActionExecuted |
ActionExecutedContext |
在行为方法执行后执行 |
OnResultExecuting |
ResultExecutingContext |
在行为方法返回前执行 |
OnResultExecuted |
ResultExecutedContext |
在行为方法返回后执行 |
/// <summary>
/// 自定义过滤器类(实现相应接口就是了)
/// </summary>
public class MyActionResultAttribute : ActionFilterAttribute//继承微软的已实现的抽象类
{
public string FilterTargetName { get; set; }
//重写里面的方法,自定义处理
/// <summary>
/// Action方法执行之前调用
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
filterContext.HttpContext.Response.Write("OnActionExecuting----执行了-" + FilterTargetName + "");
}
/// <summary>
/// Action方法执行以后调用的
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
filterContext.HttpContext.Response.Write("OnActionExecuted----执行了-" + FilterTargetName + "");
}
/// <summary>
/// Action方法执行返回结果之前调用的
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
filterContext.HttpContext.Response.Write("OnResultExecuting----执行了-" + FilterTargetName + "");
}
/// <summary>
/// Action方法返回处理结果之后调用此方法
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
filterContext.HttpContext.Response.Write("OnResultExecuted----执行了-" + FilterTargetName + "");
}
}
在控制器中使用自定义过滤器:
[MyActionResultAttribute(FilterTargetName ="Action上的过滤器")] //Action上有特性标签 就不应用别的了
public ActionResult Index()
{
ViewData["msg"] = "威海";
return View();
}
访问执行:
没有应用特性标签的Action可以应用到类特性(控制器):
[MyActionResult(FilterTargetName ="MvcFilterDemo控制器")]
public class MvcFilterDemoController : Controller
{
/////
public ActionResult Demo()
{
//action方法上没有特性标签,会应用类上面的
return View();
}
}
执行:
那么如何给全部页面Action加个过滤器呢?
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//定义全局的过滤器
filters.Add(new MyActionResultAttribute() { FilterTargetName = "全局" });
}
}
这样,访问其他没有类特性没有Action特性的方法的时候也能应用全局过滤器了。
->>>>>默认一个Action只能加载一个特性标签:那么如何同时应用Action Class 和全局过滤器呢?
//AllowMultiple:一个Action是否允许同时应用多个过滤器;AttributeTargets:特性标签可以打在什么地方呢AttributeTargets.All可以写在任何地方
[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)]
public class MyActionResultAttribute : ActionFilterAttribute//继承微软的已实现的抽象类
{
///重写Methods
}
执行之后:
过滤器执行顺序:
- 一般的顺序是由最外层到最里层,就是“全局”——>“控制器”——>“行为方法”;而特别的就是错误处理的过滤器,由于异常是由里往外抛的,所以它的顺序刚好也反过来:“行为方法”——>“控制器”——>“全局”。
End----