2012-01-31 36 views
1

我認爲我的問題圍繞着我,對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%更好更簡單的方法來完成這個工作,我可以這麼做,只要知道 - 謝謝!

回答

3

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

這個答案似乎很完美的意義除了一些原因,我仍然有導航離開和回來的網頁,變更到實際出現。任何想法爲什麼? – chilleo 2012-01-31 17:29:57

+0

@chilleo由於您的默認狀態已註銷,並且您登錄時沒有任何代碼將可見性設置爲true。查看我的更新。 – pseudocoder 2012-01-31 17:45:03

+0

哇!今天我完全失去了對不起。美麗的答案和它是有道理的,非常感謝你僞!案件關閉 – chilleo 2012-01-31 18:00:20

0

您的點擊將發生在Page_Load之後 - 顯然您知道。

你可以在點擊按鈕後隱藏控件會記住它們的狀態。

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