APS.NET MVC中的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。
自定义过滤器:
若要自定义一个过滤器,则要继承ActionFilterAttribute类,这个类是一个抽象类,实现了IActionFilter和IResultFilter接口,主要通过重写四个虚方法来达到在行为方法执行和返回的前后注入逻辑。
方法 |
参数 |
描述 |
OnActionExecuting |
ActionExecutingContext |
在行为方法执行前执行 |
OnActionExecuted |
ActionExecutedContext |
在行为方法执行后执行 |
OnResultExecuting |
ResultExecutingContext |
在行为方法返回前执行 |
OnResultExecuted |
ResultExecutedContext |
在行为方法返回后执行 |
我们新建一个MVC空项目,在根目录下面新建文件夹Filter,存放我们的自定义过滤器,添加MyCustormFilter类,继承ActionFilterAttribute并重写里面的虚方法,来满足前前后后需要处理的逻辑问题。
public class MyCustormFilter:ActionFilterAttribute { // 摘要: // 在执行操作方法后由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("OnActionExecuted > 在执行操作方法后由 ASP.NET MVC 框架调用<br/>"); base.OnActionExecuted(filterContext); } // // 摘要: // 在执行操作方法之前由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("OnActionExecuting > 在执行操作方法之前由 ASP.NET MVC 框架调用<br/>"); base.OnActionExecuting(filterContext); } // // 摘要: // 在执行操作结果后由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write("OnResultExecuted > 在执行操作结果后由 ASP.NET MVC 框架调用<br/>"); base.OnResultExecuted(filterContext); } // // 摘要: // 在执行操作结果之前由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write("OnResultExecuting > 在执行操作结果之前由 ASP.NET MVC 框架调用<br/>"); base.OnResultExecuting(filterContext); } }
我们新建Home控制器,并且新增Index视图,在Home控制器的Index方法上加上过滤器,代码如下:
public class HomeController : Controller { // // GET: /Home/ [MyCustormFilter] public ActionResult Index() { return View(); } }
过滤器经常用于权限过滤,登录状态控制过滤,异常处理过滤器。
自定义过滤器中的全局过滤器:
修改Global.asax中的代码如下:
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明, // 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } //添加全局过滤器 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new Filter.MyCustormFilter()); } }
添加Son页面,运行程序:在每一个控制器中执行的Action方法都先经过全局过滤器。
时间: 2024-11-11 17:29:20