跳到主要内容

C# 如何使⽤ ActionFilterAttribute?

参考答案:

ActionFilterAttribute 是 ASP.NET MVC 和 ASP.NET Core MVC 中用于在动作方法执行之前和之后执行自定义逻辑的一种特性(Attribute)。它提供了一种机制,允许开发者拦截并修改动作方法的执行流程。

下面是如何在 ASP.NET Core MVC 中使用 ActionFilterAttribute 的基本步骤:

  1. 创建自定义的 ActionFilterAttribute

首先,你需要创建一个继承自 ActionFilterAttribute 的类。你可以重写几个方法来定义在动作方法执行的不同阶段的逻辑:

  • OnActionExecuting:在动作方法执行之前调用。
  • OnActionExecuted:在动作方法执行之后调用。
  • OnResultExecuting:在动作结果执行之前调用(仅当动作方法成功执行后)。
  • OnResultExecuted:在动作结果执行之后调用。

下面是一个简单的例子,该例子在动作方法执行之前和之后记录日志:

using Microsoft.AspNetCore.Mvc.Filters;

public class SimpleLogFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // 在动作方法执行之前执行的逻辑
        var controllerName = context.RouteData.Values["controller"].ToString();
        var actionName = context.RouteData.Values["action"].ToString();
        var message = $"开始执行 {controllerName} 控制器的 {actionName} 动作方法";
        // 这里只是简单打印日志,实际项目中可能会记录到文件或数据库等
        System.Diagnostics.Debug.WriteLine(message);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // 在动作方法执行之后执行的逻辑
        var controllerName = context.RouteData.Values["controller"].ToString();
        var actionName = context.RouteData.Values["action"].ToString();
        var message = $"结束执行 {controllerName} 控制器的 {actionName} 动作方法";
        System.Diagnostics.Debug.WriteLine(message);
    }
}
  1. 将 ActionFilterAttribute 应用到动作方法或控制器

你有几种方式可以将你的 ActionFilterAttribute 应用到动作方法或控制器:

  • 应用到特定的动作方法:通过在动作方法上使用特性标签。
[SimpleLogFilter]
public IActionResult MyAction()
{
    // 动作方法逻辑
    return View();
}
  • 应用到整个控制器:通过在控制器类上使用特性标签。
[SimpleLogFilter]
public class MyController : Controller
{
    // 控制器内的动作方法
}
  • 全局注册:在 ASP.NET Core MVC 中,你可以在 Startup.cs 文件的 ConfigureServices 方法中全局注册你的 ActionFilter:
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.Filters.Add(new SimpleLogFilter());
    });
    // 其他配置...
}

通过全局注册,你的 ActionFilterAttribute 会应用到所有的动作方法,除非你在特定的动作方法或控制器上明确覆盖了它。

  1. 处理异常和取消动作执行

OnActionExecuting 方法中,你可以通过设置 context.Result 来取消动作方法的执行,并直接返回指定的结果。这对于基于某些条件进行权限检查或参数验证特别有用。

此外,你还可以利用 ExceptionFilterAttribute 来处理动作方法执行过程中抛出的异常。

这就是在 ASP.NET Core MVC 中使用 ActionFilterAttribute 的基本方法。你可以根据你的具体需求,扩展和定制这些过滤器以满足不同的业务场景。