分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

ASP.NET MVC中的ActionFilter介绍学习

发布时间:2023-09-06 02:04责任编辑:沈小雨关键词:.NETMVC

一直都知道MVC中的ActionFilter,只是没有在实际项目中使用过。

顾名思义,ActionFilter就是指在Action上的Filter, 那么,在Action上的Filter到底有哪些呢。首先我们看看MVC中的Controller基类(抽象类)

 ?public abstract class Controller : ControllerBase, IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer ???{ ???}

我们可以看到,它有5个Filter,分别是IActionFilter, IAuthenticationFilter, IAuthorizationFilter, IExceptionFilter, IResultFilter. 我们先看看第一个IActionFilter

IActionFilter解析

从名称就可以看出,IActionFilter是一个接口.源码如下
 ???// ???// 摘要: ???// ????Defines the methods that are used in an action filter. ???public interface IActionFilter ???{ ???????// ???????// 摘要: ???????// ????Called after the action method executes. ???????// ???????// 参数: ???????// ??filterContext: ???????// ????The filter context. ???????void OnActionExecuted(ActionExecutedContext filterContext); ???????// ???????// 摘要: ???????// ????Called before an action method executes. ???????// ???????// 参数: ???????// ??filterContext: ???????// ????The filter context. ???????void OnActionExecuting(ActionExecutingContext filterContext); ???}

可以看到,该接口中有两个方法,一个是OnActionExecuted (执行完Action之后执行该方法),另一个是OnActionExecuting(执行Action之前执行该方法)

也就是这两个方法分别在Action的前后执行. 所以它可以用于记录日志,获取action的访问量......

知道了之后,那么我们如何来实现ActionFilter呢。 

我们注意到,Controller基类继承了IActionFilter接口,而我们在MVC中写的Controller又都继承自Controller基类, 所以我们应该可以直接在MVC的Controller中override这两个方法

1. 用override的方式来实现ActionFilter

 1 ????public class HomeController : Controller 2 ????{ 3 ????????public ActionResult Index() 4 ????????{ 5 ????????????return View(); 6 ????????} 7 ?8 ????????protected override void OnActionExecuting(ActionExecutingContext filterContext) 9 ????????{10 ????????????filterContext.HttpContext.Response.Write("Execute something before action");11 12 ????????????base.OnActionExecuting(filterContext);13 ????????}14 15 ????????protected override void OnActionExecuted(ActionExecutedContext filterContext)16 ????????{17 ????????????filterContext.HttpContext.Response.Write("Execute something after action");18 19 ????????????base.OnActionExecuted(filterContext);20 ????????}21 ????}

这样好像就可以的,但是它有个问题,就是它只能用于HomeController, 有没有一种方法,我能写一个ActionFilter,可以用于多个Controller中的不同Action呢

显然,可以做到。我们可以自己写一个ActionFilter的类,使它继承IActionFilter, 如下:

2. 自定义一个ActionFilter 属性来实现IActionFilter接口

 1 ???public class MyActionFilterAttribute : Attribute, IActionFilter 2 ????{ 3 ????????public void OnActionExecuted(ActionExecutedContext filterContext) 4 ????????{ 5 ????????????filterContext.HttpContext.Response.Write("Execute something before action"); 6 ????????} 7 ?8 ????????public void OnActionExecuting(ActionExecutingContext filterContext) 9 ????????{10 ????????????filterContext.HttpContext.Response.Write("Execute something after action");11 ????????}12 ????}

 好了,到现在我们就有自己写的ActionFilter了,叫做“MyActionFilter”, 如何使用它呢,很简单的

1 ????public class HomeController : Controller2 ????{3 ????????[MyActionFilter]4 ????????public ActionResult Index()5 ????????{6 ????????????return View();7 ????????}8 ????}

除了上面两种方法,还有没有其他方法呢。事实上是有的,MVC Framework自己给我们提供了一个ActionFilterAttribute特性,这也是一个抽象类,我们来看看源码

 1 ????// 2 ????// 摘要: 3 ????// ????Represents the base class for filter attributes. 4 ????[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 5 ????public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter 6 ????{ 7 ????????// 8 ????????// 摘要: 9 ????????// ????Initializes a new instance of the System.Web.Mvc.ActionFilterAttribute class.10 ????????protected ActionFilterAttribute();11 12 ????????//13 ????????// 摘要:14 ????????// ????Called by the ASP.NET MVC framework after the action method executes.15 ????????//16 ????????// 参数:17 ????????// ??filterContext:18 ????????// ????The filter context.19 ????????public virtual void OnActionExecuted(ActionExecutedContext filterContext);20 ????????//21 ????????// 摘要:22 ????????// ????Called by the ASP.NET MVC framework before the action method executes.23 ????????//24 ????????// 参数:25 ????????// ??filterContext:26 ????????// ????The filter context.27 ????????public virtual void OnActionExecuting(ActionExecutingContext filterContext);28 ????????//29 ????????// 摘要:30 ????????// ????Called by the ASP.NET MVC framework after the action result executes.31 ????????//32 ????????// 参数:33 ????????// ??filterContext:34 ????????// ????The filter context.35 ????????public virtual void OnResultExecuted(ResultExecutedContext filterContext);36 ????????//37 ????????// 摘要:38 ????????// ????Called by the ASP.NET MVC framework before the action result executes.39 ????????//40 ????????// 参数:41 ????????// ??filterContext:42 ????????// ????The filter context.43 ????????public virtual void OnResultExecuting(ResultExecutingContext filterContext);44 ????}

所以,我们可以写一个自己的ActionFilter属性,来实现MVC Framework提供的这个类ActionFilterAttribute就好

3. 自定义一个ActionFilter 类来继承ActionFilterAttribute类
namespace MyApplication.Controllers{ ???public class HomeController : Controller ???{ ??????[MyActionFilter] ??????public ActionResult Index() ???????{ ???????????return View(); ???????} ???} ???public class MyActionFilterAttribute : ActionFilterAttribute ???{ ???????public override void OnActionExecuting(ActionExecutingContext filterContext) ???????{ ???????????base.OnActionExecuting(filterContext); ???????} ???????public override void OnActionExecuted(ActionExecutedContext filterContext) ???????{ ???????????base.OnActionExecuted(filterContext); ???????} ???}}
以上参考 http://www.cnblogs.com/huangxincheng/p/5671106.html

ASP.NET MVC中的ActionFilter介绍学习

原文地址:https://www.cnblogs.com/wphl-27/p/9322792.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved