1 自定义特性
using System; namespace WebApplication_MVC { public class AcCodeAttribueClass : Attribute { public string Code { get; set; } public string Msg { get; set; } public AcCodeAttribueClass(string code,string msg) { Code = code; Msg = msg; } } }
2 自定义过滤器
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System.Reflection; namespace WebApplication_MVC { public class MyActionFilter : ActionFilterAttribute { /// <summary> /// 当Action执行完后执行 /// </summary> /// <param name="context"></param> public override void OnActionExecuted(ActionExecutedContext context) { base.OnActionExecuted(context); } /// <summary> /// 在Action执行前执行 /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { base.OnActionExecuting(context); var controller = context.Controller; var acCodeAttribueClass = controller.GetType().GetMethod("Index").GetCustomAttribute<AcCodeAttribueClass>(); // 校验不通过 if (acCodeAttribueClass?.Code != null) { var res = "无权访问"; context.HttpContext.Response.WriteAsync(res); // 将Result设置为非空值使过滤器管道短路,会阻止管道的其余部分执行 context.Result = new JsonResult(res); } } } }
3 在 controller 中的 action 指定特性
public class LoginController : Controller { [AcCodeAttribueClass("Login","登录")] /// <summary> /// 登录页面 /// </summary> /// <returns></returns> public IActionResult Index() { return View(); }
4 在 Startup.cs 注册过滤器
5 测试
6 注意事项
执行流程:
(1) 当在 MyActionFilter 中的 OnActionExecuting 设置了 ActionExecutingContext.Result 值为非空时,这使过滤器管道短路,会阻止管道的其余部分执行;即程序执行流程如下:
MyActionFilter.OnActionExecuting --> 服务器返回响应
(2) 当未设置ActionExecutingContext.Result值时执行流程如下:
MyActionFilter.OnActionExecuting --> LoginController.Index -->MyActionFilter.OnActionExecuted --> 服务器返回响应