【问题标题】:window.onload = function() in `_Layout.cshtml` Infinity loop(ASP.NET Core)window.onload = function() in `_Layout.cshtml` 无限循环(ASP.NET Core)
【发布时间】:2021-07-22 05:17:03
【问题描述】:

我想在我的_layout.cshtml 中检查会话,它可以重定向到Login 页面,但它会无限循环

@using Microsoft.AspNetCore.Http
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
<!DOCTYPE html>
<html lang="en">
<head>
    <script type="text/javascript">
        window.onload = function () {
            if ('@HttpContextAccessor.HttpContext.Session.GetString("username")' === '') {
                location.href = "@Url.Action("Login", "Account")";
            }
        };
    </script>
</head>
<body>

</body>
</html>

【问题讨论】:

  • location.href 会导致窗口重新加载,从而触发 onload 事件。新的重定向有一个空的用户名会话,这会不断导致您的页面重新加载,从而导致无限循环。
  • 是的,这个逻辑应该被排除在登录页面运行。

标签: javascript c# asp.net-core razor


【解决方案1】:

根据您的描述,我建议您可以编写另一个条件来检查页面是否进入帐户/登录。如下:

注意:如果你使用默认身份,url路径应该是/Identity/Account/Login,所以你应该检查请求路径是不是。此外,我建议你可以直接使用location.href = "/Identity/Account/Login" 而不是"@Url.Action("Login", "Account")",因为如果帐户控制器不包含登录方法,则会生成错误的url。这也会导致无限循环。

<script type="text/javascript">
    window.onload = function () {
    
        if ('@HttpContextAccessor.HttpContext.Session.GetString("username")' === '' && '@HttpContextAccessor.HttpContext.Request.Path' !== '/Identity/Account/Login')
        {
            location.href = "/Identity/Account/Login";
        }
    };
</script>

【讨论】:

  • 谢谢,我不使用默认身份,但它有两个条件
猜你喜欢
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多