Razor Pages项目中的页面筛选器 IPageFilter 和 IAsyncPageFilter 允许 Razor Pages 在运行 Razor 页面处理程序的前后运行代码,看重点,还是和MVC过滤器一样,也分为前后。
下面我们就定义一个简单的过滤器SamplePageFilter 

public class SamplePageFilter : IPageFilter
{
    private readonly IConfiguration _config;

    public SamplePageFilter(IConfiguration config)
    {
        _config = config;
    }

    public void OnPageHandlerSelected(PageHandlerSelectedContext context)
    {
        var key = _config["UserAgentID"];
        context.HttpContext.Request.Headers.TryGetValue("user-agent", out StringValues value);
        ProcessUserAgent.Write(context.ActionDescriptor.DisplayName,
                               "SamplePageFilter.OnPageHandlerSelected",
                               value, key.ToString());
    }

    public void OnPageHandlerExecuting(PageHandlerExecutingContext context)
    {
        Debug.WriteLine("Global sync OnPageHandlerExecuting called.");
    }

    public void OnPageHandlerExecuted(PageHandlerExecutedContext context)
    {
        Debug.WriteLine("Global sync OnPageHandlerExecuted called.");
    }
}

下面就在Startup中应用以上的过滤器其中 Configuration 就是系统中的IConfiguration。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
        .AddMvcOptions(options =>
        {
            options.Filters.Add(new SamplePageFilter(Configuration));
        });
}

如果只在指定的路由上应用过滤器可以像下面这样

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages(options =>
    {
        options.Conventions.AddFolderApplicationModelConvention(
            "/Movies",
            model => model.Filters.Add(new SampleAsyncPageFilter(Configuration)));
    });
}

参考链接:https://docs.microsoft.com/zh-cn/aspnet/core/razor-pages/filter?view=aspnetcore-3.1

lebang2020.cn出品。