在ASP.NET Core中使用过滤器
ASP.NET Core是一个高性能的Web开发框架,过滤器(Filter)在ASP.NET Core中被用于路由方法之上,可以在路由方法执行前后完成一些额外的操作。本文将会介绍在ASP.NET Core中使用 IActionFilter
实现过滤器bi读取路由方法中的参数。
实现IActionFilter
IActionFilter
是一个接口,我们要构建一个实现该接口的类,并且实现其中的 OnActionExecuting
和 OnActionExecuted
方法,其中 OnActionExecuting
的调用时机在路由方法执行之前,而 OnActionExecuted
的调用时机则是在路由方法执行之后。
下面先来简单的实现一个过滤器。
public class TestActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// 路由方法执行之前
}
public void OnActionExecuted(ActionExecutedContext context)
{
// 路由方法执行之后
}
}
读取路由方法参数
如果要在过滤器之中读取到路由方法的参数,我们需要用到 ActionExecutingContext
对象中的 ActionArguments
属性,该属性是一个字典,我们可以通过具体的键来读取参数。
在上面的代码基础上,我们来读取出本次请求的 id
和 name
的值。
public class TestActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// 路由方法执行之前
var id = context.ActionArguments["id"];
var name = context.ActionArguments["name"];
}
public void OnActionExecuted(ActionExecutedContext context)
{
// 路由方法执行之后
}
}
我们在使用过滤器处理路由方法的时候,推荐使用 TryGetValue
方法来获取参数值, TryGetValue
方法会尝试从 ActionArguments
字典中获取指定参数的值,并且返回一个 bool
值,表示是否查找到值。
示例代码如下,我们还是取出 id
的值,只是这次换成了 TryGetValue
方法,如果没有找到 id
的值,那就不会进行赋值并且会执行 else
代码块。
public class TestActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// 路由方法执行之前
con idFound = context.ActionArguments.TryGetValue("id",out string id);
if(idFound)
{
//找到id
}
else
{
//没有找到id
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
// 路由方法执行之后
}
}
当我们的路由方法带有可选参数的时候,就适合使用TryGetValue
方法,对于客户端有没有提供参数都可以进行处理。
使用IActionFilter
在我们完成过滤器编写之后,只需要在路由方法上标记 [Filter]
特性即可使用。
[Filter(typeof(TestActionFilter))]
public IActionResult Get(string id, string name)
{
return Ok();
}