простая страница входа и динамическое скрытие элементов управления на основе переменной сеанса - PullRequest
1 голос
/ 31 января 2012

Я думаю, что мой вопрос вращается вокруг того, что я, к сожалению, не совсем понимаю жизненный цикл страницы в 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% лучше и проще, и я открыт, так что просто позвольте мне знать - спасибо!

Ответы [ 2 ]

3 голосов
/ 31 января 2012

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;
    }
}
0 голосов
/ 31 января 2012

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

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

Label2.Visible = false;
TextBox2.Visible = false;
Button2.Visible = false;
...