У меня есть оператор 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.

0
yaserso 27 Май 2014 в 19:32
1
Где (в какой части вашего приложения) объявлен этот оператор if?
 – 
Andrei
27 Май 2014 в 19:34

3 ответа

Лучший ответ

Вот что здесь происходит. Пользователь нажимает кнопку выхода, и происходит обратная передача. Имеющийся у вас оператор 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
Andrei 27 Май 2014 в 19:49
Спасибо огромное! Я все еще новичок в ASP, поэтому ваша разработка поможет мне лучше понять для будущих ссылок.
 – 
yaserso
27 Май 2014 в 19:53

Я хотел бы предложить поставить точку останова на LogOutUser и Page_PreRender, чтобы определить порядок вызова.

Может быть связано с управлением жизненным циклом страницы

Видеть: http://www.codeproject.com/Articles/667308 / ASP-NET-Page-Life-Cycle-Events

Маурицио

1
user3643376 27 Май 2014 в 19:57

Решил это временно, добавив Response.Redirect(Request.RawUrl)

Мой код получился так:

protected void LogOutUser(object sender, System.EventArgs e)
{
    FormsAuthentication.SignOut();
    Session.Abandon();
    Response.Redirect(Request.RawUrl);
}
0
yaserso 27 Май 2014 в 19:49