【问题标题】:Need to refresh page to see results in ASP.NET?需要刷新页面才能在 ASP.NET 中查看结果?
【发布时间】:2014-07-16 14:28:41
【问题描述】:

我有一个 if 语句来检查用户是否登录以在导航栏中显示不同的元素(如果不是用户则登录,如果是用户则注销)。

下面是 if 语句,位于 Master.master(显然是母版页)

            <% if (HttpContext.Current.User.Identity.IsAuthenticated || Session["email"] != null)
               { %>
            <ul class="nav navbar-nav">
                <li><a href="#">Browse</a></li>
                <li><a href="#">Popular</a></li>
                <li><a href="#">Reservations</a></li>
            </ul>
            <form method="post" runat="server" role="form">
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#">My Account</a></li>
                    <li><a id="btnLogOut" runat="server" href="javascript:void(0)" onserverclick="LogOutUser">Log Out</a></li>
                </ul>
            </form>
            <% }
               else
               { %>
            <ul class="nav navbar-nav">
                <li><a href="#">Browse</a></li>
                <li><a href="#">Popular</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Login <b class="caret"></b></a>
                    <div class="dropdown-menu">
                        <form id="loginform" method="post" runat="server" class="form-horizontal" role="form">
                            <div class="input-group col-xs-12">
                                <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
                                <input id="login-email" type="email" class="form-control" name="email" placeholder="email" />
                            </div>
                            <div class="input-group col-xs-12">
                                <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                                <input id="login-password" type="password" class="form-control" name="password" placeholder="password" />
                            </div>
                            <div class="login-controls input-group col-xs-12">
                                <a id="btnLogIn" runat="server" href="javascript:void(0)" onserverclick="LogInUser" class="btn btn-default col-xs-4">Login</a>
                                <div class="col-xs-offset-1 col-xs-7 checkbox-inline">
                                    <label class="navbar-text">
                                        <input id="login-remember" type="checkbox" name="remember" />
                                        Remember me

                                    </label>
                                </div>
                            </div>
                            <div id="loginMessageArea" class="alert alert-danger" runat="server">
                            </div>
                            <div class="navbar-text" id="no-account">
                                Don't have an account?
                                <a href="./Register.aspx">Register here!</a>
                            </div>
                        </form>
                    </div>
                </li>
            </ul>
            <% } %>

当点击注销按钮时,这是触发的事件。

public void LogOutUser(object sender, System.EventArgs e)
{
    FormsAuthentication.SignOut();
    Session.Abandon();
}

我面临的问题是,如果用户点击注销,页面会刷新,什么都不会发生。但是,如果我刷新页面,我会看到变化。如何更改它以便在不刷新另一个页面的情况下获得结果?

编辑:粘贴到 if 语句所在的位置。

【问题讨论】:

  • 声明if 声明的位置(在应用程序的哪个部分)?

标签: c# asp.net forms-authentication session-cookies


【解决方案1】:

这就是这里发生的事情。用户单击注销按钮,并发生回发。您拥有的if 语句在初始化阶段执行,此时用户尚未注销。然后发生事件处理,用户通过LogOutUser 处理程序中的代码注销。现在用户确实已注销,但标记中的if 已经执行,并且在此页面加载期间不会再次执行!所以页面上没有任何变化。

但是,当您刷新页面时,初始化发生时用户已经注销,因此 if 语句会按照您的预期进行评估。

要解决此问题,您可以代替简单的if,将标记包装在ContentPlaceHolder 中,并在身份验证状态已知的PreRender 上设置其可见性:

<asp:ContentPlaceHolder runat="server" ID="PlaceHolder1">
    <ul class="nav navbar-nav">
    ...
</asp:ContentPlaceHolder>

protected void Page_PreRender(object sender, EventArgs e)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated || Session["email"] != null)
    {
        PlaceHolder1.Visible = true;
    }
    else
    {
        PlaceHolder1.Visible = false;
    }
}

【讨论】:

  • 非常感谢!我还是 ASP 的初学者,所以您的阐述有助于我更好地理解以供将来参考。
【解决方案2】:

我建议在 LogOutUser 和 Page_PreRender 上设置断点,以确定调用顺序。

可以链接到页面生命周期管理

见: http://www.codeproject.com/Articles/667308/ASP-NET-Page-Life-Cycle-Events

毛里齐奥

【讨论】:

    【解决方案3】:

    通过添加Response.Redirect(Request.RawUrl)暂时解决了

    我的代码是这样的:

    protected void LogOutUser(object sender, System.EventArgs e)
    {
        FormsAuthentication.SignOut();
        Session.Abandon();
        Response.Redirect(Request.RawUrl);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多