2013-03-02 88 views
1

我正在做一個網站,我需要維護登錄用戶的會話。有不同的頁面,所以必須維護每個頁面的會話。我在主頁上的輸入按鈕的單擊事件中將值傳遞給我的會話變量。 代碼第一次正常工作,但是當用戶從另一個頁面重定向到主頁時,會話將變爲空。我很困惑在哪裏進行會議,以保留所有頁面的價值。ASP.NET,會話維護頁面加載和回發

這裏是我的代碼:根據您的問題

protected void Page_Load(object sender, EventArgs e) 
{ 
    //Session["UserName"] = null; 
    //Session["UserRoles"] = null; 
    if (!Page.IsPostBack) //if page is not postback then here 
    { 
     Session["UserName"] = null; 
     Session["UserRoles"] = null; 
     if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "Admin") 
     { 
      divLoggedInMember.Visible = true; 
      lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)"; 
     } 
     else if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "member") 
     { 
      divLoggedInMember.Visible = true; 
      lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"]; 
     } 
    } 

    else //if page postback then here 
    { 
     if (Session["UserRoles"] != null) 
     { 
      if ((String)Session["UserRoles"]=="Admin") 
      { 
       divLoggedInMember.Visible = true; 
       lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)"; 
      } 
      else 
      { 
       divLoggedInMember.Visible = true; 
       lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"]; 
      } 
     } 
    } 


} 


protected void btnenter_Click(object sender, ImageClickEventArgs e) 
    { 
     try 
     { 
      Session["UserName"] = null; 
      Session["UserRoles"] = null; 
      DataTable dt = new DataTable(); 
      dt=getUserInfo(txtUserId.Text.Trim(),txtPassword.Text.Trim()); 

      if (dt.Rows.Count == 0) 
      { 
       Response.Write("<script> alert('User Not Exist')</script>"); 
      } 
      else 
      { 
       strUserName = dt.Rows[0]["User_Name"].ToString(); 
       // strUserName = txtUserId.Text.Trim(); 
       struserRoles = dt.Rows[0]["USER_ROLE"].ToString(); 
       Session["UserName"] = (String)strUserName; 
       Session["UserRoles"] = (String)struserRoles; 

       if (Session["UserRoles"] != null && (String)Session["UserRoles"]=="Admin") 
       { 
        divLoggedInMember.Visible = true; 
        lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)"; 
       } 
       else if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "Member") 
       { 
        divLoggedInMember.Visible = true; 
        lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"]; 
       } 
       Response.Redirect("MemberPage.aspx", false); 
      } 
     } 
     catch (Exception ex) 
     { 
      ex.Message.ToString(); 
     } 
    } 
+0

根據你的問題,我不太清楚你瞭解會話行爲如何在ASP.NET中工作。您不必在同一網站中的任何頁面之間執行任何操作。 – 2013-03-02 15:42:18

+0

嗨大衛, 感謝您的回覆, 我是ASP.Net的初學者,所以我請求你對我很容易,但我知道會話保持在ASP.Net,實際上我需要知道究竟應該在哪裏我把檢查我的會話變量,以區分管理員或成員用戶,並保持該會話值? – user2126933 2013-03-02 16:34:42

+0

不是問題!其實,我認爲@Hussein Roncevic的回答非常好 - ASP。NET有能力爲您管理大部分此類內務,它將使您的代碼更容易維護。 – 2013-03-02 16:47:25

回答

1

,我不太確信你理解會話行爲在ASP.NET是如何工作的。您不必在同一網站中的任何頁面之間執行任何操作。此外,該代碼段會向您提供永遠不會做任何事情:

 // You set theses two session vars to null, but then 
     // immediately check for contents?? 
     Session["UserName"] = null; 
     Session["UserRoles"] = null; 

     // Neither of these if statements will ever evaluate to true, 
     // because you just set them to null above.. 
     if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "Admin") 
     { 
      divLoggedInMember.Visible = true; 
      lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)"; 
     } 
     else if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "member") 
     { 
      divLoggedInMember.Visible = true; 
      lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"]; 
     } 
5

,你必須是在第一if一部分,當您檢查回傳,你正在清理Session變量,然後檢查他們爲空的問題。這裏沒有意義。他們將永遠是空的,你的ifelse if永遠不會發生。重新思考你的戰略和你想達到的目標。

現在,我對你正在嘗試做什麼的評論......首先,以這種方式使用Session是你在Classic ASP中所做的一件事情。有了ASP.NET,有更好的機制可以做到這一點。相反,您應該利用MembershipProviderRoleProvider來驗證您的用戶並對其進行跟蹤。而不是從會話變量中讀取用戶名,您通常會使用Page.User.Identity.Name來檢索用戶的ID或用戶名。除此之外,您還可以在Roles類中使用Roles.IsUserInRole()或其他靜態方法。

第二件事,你重複你的變量名太多次。也就是說,您正在使用硬編碼的字符串,這些字符串在太多的地方指向相同的東西。你的維修將變得一團糟。儘管在開發階段還處於初期階段,但切換到FormsAuthentication以讓ASP.NET爲您處理上述所有任務。

更新:ASP.NET包含一組關於登錄和安全性的組件。其中之一是LoginView,它允許根據不同的角色指定不同的視圖。通過使用這個控制,你不必擔心你正在進行的檢查。

您在Page_Load中做的檢查確定無誤,但您確實需要對此進行優化。如果需要持續檢查,請不要打擾if (IsPostBack) ... else ...。外面檢查一下。例如:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Session["UserRoles"] != null && Session["UserRoles"] == "Admin") 
    { 
     // Show Admin section 
     // Hide Non-admin section 
    } 
    else 
    { 
     // Hide Admin section 
     // Show non-admin section 
    } 

    if (!IsPostBack) 
    { 
     // Do Postback logic here 
    } 
} 

同樣,你正在努力實現已經可以作爲LoginView組件。看看這些Web Forms tutorials on ASP.NET

+0

感謝Husein的回覆, – user2126933 2013-03-02 16:20:13

+0

感謝Husein的回覆,實際上我需要爲會員維護會話一個,爲會員維護會話一個,基於這些角色我需要顯示/隱藏一些元素,所以這就是爲什麼我正在進行會議並維護它們。是的,我得到了在第一個if語句中分配空值的要點。你能告訴我究竟在哪裏使用這個會話,以檢查登錄用戶是Admin還是Member? 在此先感謝 – user2126933 2013-03-02 16:27:07

+0

謝謝你們:) – user2126933 2013-03-02 17:09:13