простая страница входа и динамическое скрытие элементов управления на основе переменной сеанса

Я думаю, что мой вопрос вращается вокруг того, что у меня, к сожалению, нет удобного понимания жизненного цикла страницы в ASP.net. Я много читал, но это много, чтобы принять, извините! в любом случае, я пытаюсь сделать очень простую страницу в качестве доказательства концепции того, что я буду делать на всем сайте, поэтому сначала я просто опубликую то, что у меня есть:

ASPX:

<asp:Button ID="btnLogin" runat="server" Text="Login" 
onclick="btnLogin_Click" />

<hr />

<asp:Label ID="Label1" runat="server" Text="Regular User"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server">Regular User</asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Regular User" />

<hr />

<asp:Label ID="Label2" runat="server" Text="Admin"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server">Admin</asp:TextBox>
<asp:Button ID="Button2" runat="server" Text="Admin" />

ASPX.CS:

    protected void Page_Load(object sender, EventArgs e)
    {

        String admin = (String)(Session["admin"]) ?? "";

        if (!admin.Equals("true"))
        {
            Label2.Visible = false;
            TextBox2.Visible = false;
            Button2.Visible = false;
        }

    }

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        Session["admin"] = "true";
    }

Поэтому я хочу, чтобы все случайные элементы управления скрывались, как только пользователь «становится администратором», иначе переменная сеанса изменяется. Моя проблема в том, что элементы управления не скрываются напрямую после нажатия кнопки. Я должен обновить или уйти и вернуться. Имея дело с проблемами жизненного цикла страницы, прежде чем я подумал, что это то, что все испортило, возможно, мне просто нужно отключить видимость в функции, отличной от Page_Load? В любом случае, может быть на 100% лучший и более простой способ сделать это в целом, к которому я открыт, так что просто дайте мне знать - спасибо!


person chilleo    schedule 31.01.2012    source источник


Ответы (2)


Обработчики Button.Click возникают после Page.Load. Это означает, что при нажатии кнопки вам необходимо установить состояния элементов управления после установки переменной сеанса, чтобы изменения отображались на первой странице после нажатия кнопки.

Кроме того, ViewState сохранит свойства, которые вы установили для элементов управления, поэтому вам необходимо проверить состояние входа и выхода из системы и установить правильное состояние в обоих направлениях.

Код:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Session["admin"] = null;
    }
    Set_Control_State();
}

protected void btnLogin_Click(object sender, EventArgs e)
{
    String admin = (String)(Session["admin"]) ?? "";
    if (admin.Equals("true"))
    {
        Session["admin"] = null;
    }
    else
    {
        Session["admin"] = "true";
    }
    Set_Control_State();
}

protected void Set_Control_State()
{
    String admin = (String)(Session["admin"]) ?? "";

    if (admin.Equals("true"))
    {
        btnLogin.Text = "Log Out";
        Label2.Visible = true;
        TextBox2.Visible = true;
        Button2.Visible = true;
    }
    else
    {
        btnLogin.Text = "Log In";
        Label2.Visible = false;
        TextBox2.Visible = false;
        Button2.Visible = false;
    }
}
person pseudocoder    schedule 31.01.2012
comment
этот ответ, кажется, имеет смысл, за исключением того, что по какой-то причине мне все еще приходится уходить и возвращаться на страницу, чтобы изменения действительно появились. есть идеи почему? - person chilleo; 31.01.2012
comment
@chilleo Потому что ваше состояние по умолчанию — выход из системы, и когда вы входите в систему, у вас не было никакого кода, чтобы установить для видимости значение true. Смотрите мое обновление. - person pseudocoder; 31.01.2012
comment
ВОТ ЭТО ДА! я полностью не в себе сегодня, извините. красивый ответ, и это имеет смысл, большое спасибо псевдо! дело закрыто - person chilleo; 31.01.2012

Ваш щелчок произойдет после Page_Load, что, очевидно, вам известно.

Вы можете сделать скрытие после нажатия кнопки, элементы управления запомнят свое состояние.

Label2.Visible = false;
TextBox2.Visible = false;
Button2.Visible = false;
person Dave Walker    schedule 31.01.2012