需要刷新页面才能在ASP.NET中查看结果?

时间:2014-05-27 15:32:02

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

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

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

            <% 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语句的位置。

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

我想建议在LogOutUser和Page_PreRender上放置断点,以确定呼叫顺序。

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

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

莫里吉奥

答案 2 :(得分:0)

通过添加Response.Redirect(Request.RawUrl)

暂时解决了这个问题

我的代码原样如此:

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