目录
一:说明
ActionFilterAttribute比前两者简单方便,易于扩展,不易产生代码冗余。
ActionFilterAttribute过滤器执行顺序:
1:执行控制器中的构造函数,实例化控制器
2:执行ActionFilterAttribute.OnActionExecutionAsync方法
3:【没有OnActionExecutionAsync方法执行ActionFilterAttribute.OnActionExecuting方法和ActionFilterAttribute.OnActionExecuted方法】
4:执行具体的Action方法
5:执行ActionFilterAttribute.OnResultExecutionAsync方法
6:【没有OnResultExecutionAsync方法执行ActionFilterAttribute.OnResultExecuting方法和ActionFilterAttribute.OnResultExecuted方法】
实现ActionFilterAttribute抽象父类后,有异步方法则执行异步方法;没有异步方法执行同步方法。
二:实现ActionFilterAttribute父类
控制器代码:
/// <summary>
/// Get请求
/// 应用ActionResultFilter扩展
/// Home控制器的Index
/// </summary>
/// <returns>Index视图</returns>
[HttpGet]
[TypeFilter(typeof(ActionResultFilter))]
public IActionResult Index(int id)
{
return Json(new
{
Id = 123456,
Name = "Vin Cente",
Age = 28
});
}
关键ActionResult类代码:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using Study_ASP.NET_Core_MVC.Controllers;
using Study_ASP.NET_Core_MVC.Models;
namespace Study_ASP.NET_Core_MVC.Utility.Filters
{
public class ActionResultFilter : ActionFilterAttribute
{
/// <summary>
/// 初始化构造函数
/// </summary>
private readonly ILogger<ActionResultFilter> _logger;
public ActionResultFilter(ILogger<ActionResultFilter> logger)
{
_logger = logger;
}
/// <summary>
/// 在XXX执行之前
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuting(ActionExecutingContext context)
{
var controller = context.HttpContext.GetRouteValue("Controller");
var action = context.HttpContext.GetRouteValue("Action");
var param = context.HttpContext.Request.QueryString.Value;
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求参数:{JsonConvert.SerializeObject(param)}");
}
/// <summary>
/// 在XXX执行之后
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuted(ActionExecutedContext context)
{
var controller = context.HttpContext.GetRouteValue("Controller");
var action = context.HttpContext.GetRouteValue("Action");
var param = context.Result;
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求结果:{JsonConvert.SerializeObject(param)}");
}
/// <summary>
/// 在XXX执行时
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var controller = context.HttpContext.GetRouteValue("Controller");
var action = context.HttpContext.GetRouteValue("Action");
var param = context.HttpContext.Request.QueryString.Value;
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求参数:{JsonConvert.SerializeObject(param)}");
ActionExecutedContext executedContext = await next.Invoke();
_logger.LogInformation($"当前请求的控制器:{controller},方法:{action},请求结果:{JsonConvert.SerializeObject(executedContext.Result)}");
}
/// <summary>
/// 在XXX执行之前
/// </summary>
/// <param name="context"></param>
public override void OnResultExecuting(ResultExecutingContext context)
{
if (context.Result is JsonResult)
{
JsonResult result = (JsonResult)context.Result;
context.Result = new JsonResult(new AjaxResult()
{
Success = true,
Message = "Ok",
Data = result.Value
});
}
}
/// <summary>
/// 在XXX执行之后
/// </summary>
/// <param name="context"></param>
public override void OnResultExecuted(ResultExecutedContext context)
{
Console.WriteLine("在XXX执行之后ResultFilter.OnResultExecuted方法");
}
/// <summary>
/// 在XXX执行时
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
if (context.Result is JsonResult)
{
JsonResult result = (JsonResult)context.Result;
context.Result = new JsonResult(new AjaxResult()
{
Success = true,
Message = "Ok",
Data = result.Value
});
}
await next.Invoke();
}
}
}
关键AjaxResult类代码:
namespace Study_ASP.NET_Core_MVC.Models
{
public class AjaxResult
{
/// <summary>
/// 初始化结果
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 初始化结果信息
/// </summary>
public string? Message { get; set; }
/// <summary>
/// 初始化结果数据
/// </summary>
public object? Data { get; set; }
}
}
结果截图: