Что эквивалентно Web Forms Page_Load в ASP.NET Core 5, чтобы мой код выполнялся до загрузки любой страницы?

Есть ли способ выполнять код при каждой загрузке страницы в ASP.NET Core 5, как в веб-формах? В Web Forms я использовал обработчик событий Page_Load(), но что эквивалентно ему в ASP.NET Core 5? Поэтому, если я вызову какое-либо действие в любом контроллере, он сначала запустит мой код, а затем запустит выполнение действия.

Я нашел это: Как выполнить общий код для каждого запроса?, но когда я попробовал, я получил ошибки.

Пожалуйста, дайте мне четкое решение.

Кроме того, мне нужно решение для проверки сеанса из одного места, вместо того, чтобы писать код проверки сеанса в каждом контроллере, я создаю сеанс после успешного входа в систему, но как лучше всего проверить сеанс на всех контроллерах и если это null, а затем перенаправить на страницу входа?


person fiverbox.com    schedule 26.08.2020    source источник
comment
Если ваш второй вопрос по-прежнему вас интересует, я бы рекомендовал выделить его в отдельный вопрос, поскольку он не имеет прямого отношения к вашему основному вопросу.   -  person Jeremy Caney    schedule 23.11.2020
comment
Я попытался добавить еще один вопрос, но получил следующее: Вы достигли лимита вопросов.   -  person fiverbox.com    schedule 24.11.2020


Ответы (1)


В ядре asp.net вы можете использовать Фильтры действий для замены метода Page_Load в веб-форме.

Вы можете зарегистрировать глобальную область фильтров действий при запуске, чтобы гарантировать, что фильтры действий будут выполняться перед выполнением каждого действия.

Добавьте следующий фильтр действий в свой проект:

public class MyActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {

                // Do something before the action executes.
            if (!context.HttpContext.Request.Path.ToString().Contains("Login"))
            {
                if (context.HttpContext.Session.GetString("user") == null)
                {
                    context.Result = new RedirectToRouteResult(
                        new RouteValueDictionary { { "controller", "Login" }, { "action", "Index" } });
                }
            }
            
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Do something after the action executes.
        }
    }

Затем в методе startup.cs ConfigureServices добавьте следующий код, чтобы применить его ко всей области:

services.AddControllersWithViews(options =>
            {
                options.Filters.Add(typeof(MyActionFilter));
            });
person LouraQ    schedule 27.08.2020
comment
Спасибо Yongqing, он работает отлично, не могли бы вы обновить свой ответ и объяснить, как добавить фильтр действий, чтобы другие знали об этом. - person fiverbox.com; 27.08.2020
comment
@fiverbox.com, На самом деле, мой ответ ясно объяснил, как использовать фильтры действий, и я предоставил официальное руководство по фильтрам в ядре asp.net: docs.microsoft.com/en-us/aspnet/core/mvc/controllers/ - person LouraQ; 27.08.2020