C# 如何使⽤ ActionFilterAttribute?
参考答案:
ActionFilterAttribute
是 ASP.NET MVC 和 ASP.NET Core MVC 中用于在动作方法执行之前和之后执行自定义逻辑的一种特性(Attribute)。它提供了一种机制,允许开发者拦截并修改动作方法的执行流程。
下面是如何在 ASP.NET Core MVC 中使用 ActionFilterAttribute
的基本步骤:
- 创建自定义的 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);
}
}
- 将 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
会应用到所有的动作方法,除非你在特定的动作方法或控制器上明确覆盖了它。
- 处理异常和取消动作执行
在 OnActionExecuting
方法中,你可以通过设置 context.Result
来取消动作方法的执行,并直接返回指定的结果。这对于基于某些条件进行权限检查或参数验证特别有用。
此外,你还可以利用 ExceptionFilterAttribute
来处理动作方法执行过程中抛出的异常。
这就是在 ASP.NET Core MVC 中使用 ActionFilterAttribute
的基本方法。你可以根据你的具体需求,扩展和定制这些过滤器以满足不同的业务场景。