首页 > 解决方案 > Asp.net Core Razor 页面中的 ActionFilter 等效项

问题描述

首先,我知道 asp.net core razor pages 中没有 Action Filter。但我正在寻找一种类似的机制。我想要实现的是基于处理程序方法应用过滤器。当我尝试使用页面过滤器时,它适用于所有方法。是否有任何方法/方式可以在同一页面上排除某些处理程序方法?

为了澄清问题,我添加了一些示例。

这是示例页面过滤器

public class FormValidatorRazor : IAsyncPageFilter
{
    public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
    {
        if (context.HttpContext.Request.Method.Equals("POST") || context.HttpContext.Request.Method.Equals("PUT"))
        //code removed for brevity
 }

这是我将其应用于项目的方式

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages().AddMvcOptions(options =>
    {
        options.Filters.Add(new FormValidatorRazor());
        //code removed for brevity
    }
}

这是示例处理程序方法。

public async Task<IActionResult> OnPostUpdate(ExModel model)
{
}

public async Task<IActionResult> OnPostEdit(ExModel model)
{
}

我希望我的过滤器应用于 OnPostUpdate 但不应用于 OnPostEdit。如何实现该行为?

标签: c#asp.net-corerazorrazor-pagesaction-filter

解决方案


PageHandlerExecutingContext传入的参数OnPageHandlerExecutionAsync提供了实现此目的所需的一切。这是一个显示细节的示例:

public async Task OnPageHandlerExecutionAsync(
    PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
    if (context.HandlerMethod?.Name == "Update")
    {
        // Running inside a handler method named "Update".
    }

    // ...
}

HandlerMethodnull在执行处理程序方法时为非。它提供了这些可能感兴趣的属性:

或者,如果您想在处理程序级别选择退出,您可以使用自定义属性并检查它是否存在于OnPageHandlerExecutionAsync

public class SomePageFilterExcludeAttribute : Attribute { }

[SomePageFilterExclude]
public void OnPostUpdate() { }

public async Task OnPageHandlerExecutionAsync(
    PageHandlerExecutingContext ctx, PageHandlerExecutionDelegate next)
{
    var isHandlerExcluded = ctx.HandlerMethod?.MethodInfo?.
        GetCustomAttributes(typeof(SomePageFilterExcludeAttribute), false).Any() == true;

    // ...
}

推荐阅读