您现在的位置是:网站首页> 编程资料编程资料
ASP.NET MVC自定义操作过滤器_实用技巧_
2023-05-24
381人已围观
简介 ASP.NET MVC自定义操作过滤器_实用技巧_
一、操作过滤器
1、定义
操作过滤器用于实现IActionFilter接口以及包装操作方法执行。IActionFilter接口声明两个方法:OnActionExecuting和OnActionExecuted。OnActionExecuting在操作方法之前运行。OnActionExecuted在操作方法之后运行,可以执行其他处理,如向操作方法提供额外数据、检查返回值或取消执行操作方法。
查看ActionFilterAttribute类的定义:
#region 程序集 System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 // D:\Practice\MVC\自定义操作过滤器\MVCCustomerActionFilterDemo\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll #endregion namespace System.Web.Mvc { // // 摘要: // 表示筛选器特性的基类。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter { // // 摘要: // 初始化 System.Web.Mvc.ActionFilterAttribute 类的新实例。 protected ActionFilterAttribute(); // // 摘要: // 在执行操作方法后由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public virtual void OnActionExecuted(ActionExecutedContext filterContext); // // 摘要: // 在执行操作方法之前由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public virtual void OnActionExecuting(ActionExecutingContext filterContext); // // 摘要: // 在执行操作结果后由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public virtual void OnResultExecuted(ResultExecutedContext filterContext); // // 摘要: // 在执行操作结果之前由 ASP.NET MVC 框架调用。 // // 参数: // filterContext: // 筛选器上下文。 public virtual void OnResultExecuting(ResultExecutingContext filterContext); } }根据方法的名字就知道4个方法执行的顺序了:
OnActionExecuting是Action执行前的操作、OnActionExecuted则是Action执行后的操作、OnResultExecuting是解析ActionResult前执行、OnResultExecuted是解析ActionResult后执行。
即:Action执行前:OnActionExecuting方法先执行→Action执行 →OnActionExecuted方法执行→OnResultExecuting方法执行→返回的ActionRsult中的 executeResult方法执行→OnResultExecuted执行。
2、案例
2.1、创建自定义操作过滤器
新建一个自定义过滤器,然后重新里面的方法,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCustomerActionFilterDemo.Extension { public class CustomerActionFilter :ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("Action方法准备执行"); base.OnActionExecuting(filterContext); } public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("Action方法执行结束"); base.OnActionExecuted(filterContext); } } }2.2、新建控制器
创建一个控制器,用来测试自定义操作过滤器,代码如下:
using MVCCustomerActionFilterDemo.Extension; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCustomerActionFilterDemo.Controllers { public class ActionFiltersController : Controller { // GET: ActionFilters [CustomerActionFilter] public ActionResult Index() { Response.Write("执行Index...
"); return View(); } } }Index方法对应的视图代码如下:
@{ Layout = null; } Index 操作过滤器测试页面
运行结果;

二、结果过滤器
1、定义
结果筛选器用于实现IResultFilter接口以及包装ActionResult对象的执行。IResultFilter接口声明两个方法OnResultExecuting和OnResultExecuted。OnResultExecuting在执行ActionResult对象之前运行。OnResultExecuted在结果之后运行,可以对结果执行其他处理,如修改 HTTP 响应。
结果过滤器也是实现了ActionFilterAttribute类。
2、案例
修改CustomerActionFilter类,重写OnResultExecuting和OnResultExecuted,修改后的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCustomerActionFilterDemo.Extension { public class CustomerActionFilter :ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("Action方法准备执行"); base.OnActionExecuting(filterContext); } public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("Action方法执行结束"); base.OnActionExecuted(filterContext); } public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write("Action方法执行结束,准备呈现视图"); base.OnResultExecuting(filterContext); } public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write("视图呈现结束"); base.OnResultExecuted(filterContext); } } }运行结果:

三、案例
1、记录操作
在真实项目中,可以利用操作过滤器记录哪个用户登录系统以后进行了哪些操作。
1.1、创建实体类
新建用于记录信息的实体类。代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MVCCustomerActionFilterDemo.Models { public class LogEntity { /// /// 控制器名称 /// public string ControllerName { get; set; } /// /// Action方法名称 /// public string ActionName { get; set; } /// /// 操作用户id /// public string OperationUserId { get; set; } /// /// 操作时间 /// public DateTime OperationTime { get; set; } } }1.2、创建日志类
创建日志帮助类,代码如下:
using MVCCustomerActionFilterDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; namespace MVCCustomerActionFilterDemo.Util { public class LogHelper { /// /// 记录操作日志 /// 这里为了方便测试记录到txt文件里面,实际中应该是记录到数据库中 /// 然后有界面可以显示这些操作记录 /// /// public static void WriteOperRecore(LogEntity entity) { string strPath = @"C:\log.txt"; using (StreamWriter sw = new StreamWriter(strPath, true)) { sw.WriteLine("**************************"); sw.WriteLine($"操作时间:{entity.OperationTime}"); sw.WriteLine($"当前Controller名称:{entity.ControllerName}"); sw.WriteLine($"当前Action名称:{entity.ActionName}"); sw.WriteLine($"当前操作用户id:{entity.OperationUserId}"); sw.Close(); } } } }1.3、修改操作过滤器类
修改后的操作过滤器类代码如下:
using MVCCustomerActionFilterDemo.Models; using MVCCustomerActionFilterDemo.Util; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCCustomerActionFilterDemo.Extension { public class CustomerActionFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("Action方法准备执行"); string strControllerName = filterContext.RouteData.Values["controller"].ToString(); string strActionName = filterContext.RouteData.Values["action"].ToString(); LogEntity entity = new LogEntity() { OperationTime = DateTime.Now, ControllerName = strControllerName, ActionName = strActionName, // 为了方便测试写admin,真实案例需要获取当前登录的用户 OperationUserId = "admin" }; // 记录操作记录 LogHelper.WriteOperRecore(entity); base.OnActionExecuting(filterContext); } public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("Action方法执行结束"); base.OnActionExecuted(filterContext); } public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write("Action方法执行结束,准备呈现视图"); base.OnResultExecuting(filterContext); } public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write("视图呈现结束"); base.OnResultExecuted(filterContext); } } }运行程序,查看生成的日志:

2、实现权限控制功能
可以重写OnActionExecuting方法实现授权过滤器一样的功能,因为OnActionExecuting方法是在Action方法执行前执行的,自定义一个实现ActionFilterAttribute类的CustomerActionPremisFilters类,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MV
相关内容
- ASP.NET MVC自定义授权过滤器_实用技巧_
- 教你使用.NET快速比较两个byte数组是否相等_实用技巧_
- 详解ASP.NET Core高性能服务器HTTP.SYS_实用技巧_
- ASP.NET Core服务生命周期_基础应用_
- ASP.NET Core依赖关系注入_基础应用_
- ASP.NET Core应用启动Startup类简介_基础应用_
- .NET与树莓派控制彩色灯带WS28XX的实现_实用技巧_
- ASP.NET的Core AD域登录过程示例_ASP.NET_
- CZGL.ProcessMetrics处理监控数据的三种方式介绍_实用技巧_
- CZGL.ProcessMetrics监控.NET应用_实用技巧_
点击排行
本栏推荐
