在Asp.net Core Razor Pages中,ActionFilter的等价物。

问题描述 投票:-1回答:1

首先,我知道在asp.net core razor页面中没有Action Filter,但我正在寻找一种类似的机制,我试图实现的是基于处理程序方法的过滤,当我尝试使用pagefilter时,它被应用于所有方法,有什么方法可以排除同一页面中的一些处理程序方法?

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

下面是pagefilter的例子

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
    }
}

这里是一个处理方法的例子,我想让我的过滤器应用于OnPostUpdate,而不应用于OnPostEdit。

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

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

我想让我的过滤器应用于OnPostUpdate,但不应用于OnPostEdit,我如何实现这种行为?

c# asp.net-core razor razor-pages action-filter
1个回答
2
投票

PageHandlerExecutingContext 传入的参数 OnPageHandlerExecutionAsync 提供了您实现这一目标所需的一切。这里有一个例子可以说明具体情况。

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

    // ...
}

HandlerMethod 是非null 当一个处理程序方法被执行时,它提供了这些属性。它提供的这些属性,可能会让人感兴趣。

另外,如果您想在以下时间段内选择退出 处理者 级别,你可以使用自定义属性,并检查它在 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;

    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.