0

有没有办法在 ASP.NET Core 5 中的每个页面加载时执行代码,就像在 Web 窗体中一样?在 Web 窗体中,我使用了Page_Load()事件处理程序,但 ASP.NET Core 5 中的等价物是什么?因此,如果我在任何控制器中调用任何操作,它将首先运行我的代码,然后运行操作执行。

我发现了这个:如何为每个请求执行通用代码?, 但是当我尝试它时,我得到了错误。

请有人为我提供明确的解决方案。

另外,我需要一种从一个地方检查会话的解决方案,而不是在每个控制器中编写“检查会话代码”,而是在登录成功后创建会话,但是在所有控制器中检查会话的最佳方法是什么如果它为空,则重定向到登录页面?

4

1 回答 1

3

在 asp.net core 中,您可以使用Action 过滤器来替换 webform 中的“Page_Load”方法。

您可以在启动时注册Action过滤器的全局范围,以确保在执行每个操作之前都会执行Action过滤器。

在您的项目中添加以下操作过滤器:

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));
            });
于 2020-08-27T03:05:38.987 回答