Scaffold Identity UI в ASP.NET Core 2.1 и добавление глобального фильтра - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть приложение ASP.NET Core 2.1, в котором я использую леса идентификации, как описано выше здесь

Теперь у меня есть глобальный фильтр для OnActionExecuting

public class SmartActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ...
    }
}

И в файле startup.cs я настроил фильтр, как показано ниже

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddMvc(options =>
        {
            options.Filters.Add(new AddHeaderAttribute("Author", "HaBo")); // an instance
            options.Filters.Add(typeof(SmartActionFilter)); // by type
            // options.Filters.Add(new SampleGlobalActionFilter()); // an instance
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
            options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
        });
}

Этот фильтр используется для всех методов действий, но не для тех, которые находятся в области идентификации.Как настроить глобальный фильтр для всех страниц в области идентификации?

1 Ответ

0 голосов
/ 12 декабря 2018

В первом абзаце Фильтры в ASP.NET Core вы увидите следующее примечание:

Важно

Эта тема не применима к Razor Pages.ASP.NET Core 2.1 и более поздние версии поддерживают IPageFilter и IAsyncPageFilter для Razor Pages.Для получения дополнительной информации см. Методы фильтрации для страниц Razor .

Это объясняет, почему ваша реализация SmartActionFilter выполняется только для действий, а не для обработчиков страниц,Вместо этого вы должны реализовать IPageFilter или IAsyncPageFilter, как указано в примечании:

public class SmartActionFilter : IPageFilter
{
    public void OnPageHandlerSelected(PageHandlerSelectedContext ctx) { }

    public void OnPageHandlerExecuting(PageHandlerExecutingContext ctx)
    {
        // Your logic here.
    }

    public void OnPageHandlerExecuted(PageHandlerExecutedContext ctx)
    {
        // Example requested in comments on answer.
        if (ctx.Result is PageResult pageResult)
        {
            pageResult.ViewData["Property"] = "Value";
        }

        // Another example requested in comments.
        // This can also be done in OnPageHandlerExecuting to short-circuit the response.
        ctx.Result = new RedirectResult("/url/to/redirect/to");
    }
}

Регистрация SmartActionFilter по-прежнему выполняется так же, как показано в вашем вопросе (с использованием MvcOptions.Filters).

Если вы хотите запустить это для обоих обработчиков страниц и , похоже, вам может потребоваться реализовать оба IActionFilter и IPageFilter.

...