在ASP.NET Core中使用过滤器

在ASP.NET Core中使用过滤器

ASP.NET Core是一个高性能的Web开发框架,过滤器(Filter)在ASP.NET Core中被用于路由方法之上,可以在路由方法执行前后完成一些额外的操作。本文将会介绍在ASP.NET Core中使用 IActionFilter 实现过滤器bi读取路由方法中的参数。

实现IActionFilter

IActionFilter 是一个接口,我们要构建一个实现该接口的类,并且实现其中的 OnActionExecutingOnActionExecuted 方法,其中 OnActionExecuting 的调用时机在路由方法执行之前,而 OnActionExecuted 的调用时机则是在路由方法执行之后。

下面先来简单的实现一个过滤器。

public class TestActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 路由方法执行之前
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 路由方法执行之后
    }
}

读取路由方法参数

如果要在过滤器之中读取到路由方法的参数,我们需要用到 ActionExecutingContext 对象中的 ActionArguments 属性,该属性是一个字典,我们可以通过具体的键来读取参数。

在上面的代码基础上,我们来读取出本次请求的 idname 的值。

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();
}
发布时间:2024-08-07
其他阅读

Angular 中跨分模块后路由复用问题

当我们的 Angular 应用越来越大后,就需要考虑使用模块或者直接使用库来将解体应用,使用时进来懒加载,加快访问速度。当跨分模块后,普通的路由复用策略就是失效,需要额外的解决方法。

查看原文

Angular中开发一个代码库

Angular 的复杂项目中,我们可以对其拆分出不同功能模块进行开发,但是对于大型项目,或者我们直接考虑拆成库,将一部分的模块合起来组成一个库,方便复用,比如我们熟悉的各种设计组件库,就是一堆模块的合集。

查看原文

扩展Serilog实现日志推送平台

最近在完成一个服务管理平台,提供可视化管理车间控制服务,包括服务的启停,日志的查看。在各服务中使用 Serilog 对日志进行记录,推送到服务管理平台,再进行统一分发,各客户端同步查看服务运行日志。

查看原文

个人简介

你好,我是猪头少年,是一名定居在云南的软件工程师,主要的开发语言为 C#JavaScript,涉及 ASP.NET CoreWPFAngularUnity 以及 Babylon.js。平时喜欢自驾出游。欢迎大家联系我。

查看原文

Apple网页中滚动效果

打开Apple官网查看iPhone页面,我们可以看到一个特殊效果,当你滚动鼠标时,页面不出现滚动效果,但内容却在变化。现在,基于 position : sticky 可以很容易实现这个效果。

查看原文