您现在的位置是:网站首页> 编程资料编程资料

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
                
                

-六神源码网