Asp.net MVC 5 视图在使用 F5 重新加载页面之前不呈现

Posted

技术标签:

【中文标题】Asp.net MVC 5 视图在使用 F5 重新加载页面之前不呈现【英文标题】:Asp.net MVC 5 View not rendering until page reloaded with F5 【发布时间】:2019-03-30 02:45:54 【问题描述】:

当我的应用程序的用户直接按下“注销”按钮时,他们将被注销并返回到登录页面(有关这两个操作,请参见下面的代码)。这按预期工作,但是管理员用户可以强制注销单个用户。我目前正在使用 SignalR 完成此操作,并且遇到了一个奇怪的问题。

当我从客户端方法重定向到LogOff 时,一切都被正确调用。客户端用户已注销,RedirectToAction 正确重定向到 LogIn 操作。但是,LogIn 视图在我使用 F5 手动刷新页面之前不会呈现。我完全无法弄清楚为什么第一次没有渲染视图

注销操作

    public ActionResult LogOff()
    
        FormsAuthentication.SignOut();

        return RedirectToAction("Login", "Account");
    

登录操作

    public ActionResult Login(string returnUrl, string displayMsg)
    
        ViewBag.ReturnUrl = returnUrl;
        ViewBag.DisplayMsg = displayMsg;
        ViewBag.PasswordAttempts = 0;
        return View();
    

SignalR 客户端方法

$.connection.hub.start();
authHub.client.LogOut = function () 
    $.ajax(
        url: '@Url.Action("LogOff", "Account", new  area = "")',
        type: "POST"
    );
    $.connection.hub.stop();

登录查看

section id="loginForm">

            <div class="col-md-12">
                <div class="wrap">
                    <p class="form-title">Log In</p>

                        @using (html.BeginForm("Login","Account",new ViewBag.ReturnUrl, ViewBag.PasswordAttempts, FormMethod.Post, new@class="login"))
                        
                            @Html.AntiForgeryToken()
                            <section class="DisplayMsg">@ViewBag.DisplayMsg</section>

                            <section>@Html.ValidationMessageFor(m => m.UserName) </section>
                            <label>User Name:</label> @Html.TextBoxFor(m => m.UserName)

                            <section>@Html.ValidationMessageFor(m => m.Password)</section>
                            <label>Password:</label>@Html.PasswordFor(m => m.Password)

                            <input type="submit" value="Log In" class="btn btn-success btn-sm" />
                                @*<div class="reset-forgot">
                                    <div class="row">
                                        <div class="col-md-6 reset-pass-content">
                                            @Html.ActionLink("Reset Password", "PasswordReset", "Account", new area = string.Empty)
                                        </div>
                                    </div>
                                </div>*@
                        
                </div>
            </div>

【问题讨论】:

【参考方案1】:

因为你做了一个 Ajax 调用,它永远不会将用户重定向到登录页面,它只会在服务器端注销用户。您可以使用location.href 将用户在服务器中注销后重定向到登录页面:

$.connection.hub.start();
   authHub.client.LogOut = function () 
      $.connection.hub.stop();
      $.ajax(
      url: '@Url.Action("LogOff", "Account", new  area = "")',
      type: "POST",
      success: function()
          location.href = '@Url.Action("Login", "Account")'
      
  );

【讨论】:

以上是关于Asp.net MVC 5 视图在使用 F5 重新加载页面之前不呈现的主要内容,如果未能解决你的问题,请参考以下文章

模态视图重新加载内容 (Bootstrap MVC ASP.NET)

单击按钮后在视图中加载数据而不重新加载页面asp.net mvc中的所有数据

如何在不重新加载页面的情况下使用 ASP.NET MVC 5 将数据导出到 Excel?

在 ASP.NET MVC 5 中搭建外部模型

在 ASP.Net MVC 5 中将 javascript 数组从视图传递到控制器

ASP.NET 5 MVC:无法连接到 Web 服务器“IIS Express”