MVC 过滤器常用有4种
- Action过滤器(IActionFilter) =》 行为过滤器
- Result过滤器 (IResultFilter)=》 视图过滤器 或 结果过滤器
- Exception过滤器(IExceptionFilter)=》 异常过滤器
- Authorization过滤器(IAuthorizationFilter) =》权限校验过滤器
Action过滤器:在Action执行之前和执行之后触发
Result过滤器:在结果之前和结果之后触发
Exception过滤器: 在发生异常时调用
Authorization过滤器:身份验证时触发
》》过滤器的作用
一般用于记录日志、异常处理、身份验证、行为记录等
》》》 定义一个Attribute
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WEBMVC.Models
{
public class MyActionFilterAttribute:ActionFilterAttribute
{
public string ExecName{ get; set; }
/// <summary>
/// Action 执行之前
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
HttpContext.Current.Response.Write("<br/>OnActionExecuting :" + ExecName + " 执行了");
}
/// <summary>
/// Action 执行之后
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
HttpContext.Current.Response.Write("<br/>OnActionExecuted: "+ExecName+" 执行了");
}
/// <summary>
/// ActionResult执行 之前
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
HttpContext.Current.Response.Write("<br/> OnResultExecuting "+ ExecName+" 执行了");
}
/// <summary>
/// ActionResult执行 之后
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
HttpContext.Current.Response.Write("<br/> OnResultExecuted "+ExecName+" 执行了");
}
}
}
》》 过滤器可以作用到控制器、Action。
过滤器有优先级,越靠近Action优先级越高。
如果控制器和方法都标记了过滤器,会选择方法上的过滤器,也可以设置打开所有过滤器设置,将两个过滤器都触发,这个设置默认是关闭的。
全局过滤器
1》》在App_Start 文件夹中创建 FilterConfig.cs 类 内容如下:
using System.Web.Mvc;
using WEBMVC.Models; //MyActionFilterAttribute 的命名空间
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
// 添加自定义的全局过滤器
filters.Add(new MyActionFilterAttribute() { ExecName="Global"});
}
}
如果要实现触发多个过滤器,需要开启如下:
在过滤器追加特性
[AttributeUsage(AttributeTargets.All,AllowMultiple =true)]
在重写的过滤器方法中可以获取必要的信息 进制判断
》》》异常过滤器