Эквивалент ActionFilter в Asp. net Core Razor Pages - PullRequest
0 голосов
/ 01 мая 2020

Прежде всего, я знаю, что в asp. net основных страницах бритвы нет фильтра действий. Но я ищу, чтобы найти механизм, который работает аналогично. Я пытаюсь добиться применения фильтра, основанного на методах-обработчиках. Когда я пытаюсь использовать 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
    }
}

Вот пример обработчика методы.

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

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

Я хочу, чтобы мой фильтр был применен к OnPostUpdate, но не к OnPostEdit. Как мне добиться такого поведения?

1 Ответ

2 голосов
/ 01 мая 2020

Параметр 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;

    // ...
}
...