2013-03-02 3 views
1

Я создаю сайт, на котором мне нужно поддерживать сеанс входа в систему User. Существуют разные страницы, поэтому необходимо поддерживать сеанс для каждой страницы. Я передаю значение в моей переменной сеанса при нажатии кнопки ввода на домашней странице. Код работает отлично в первый раз, но когда пользователь перенаправляет с другой страницы на домашнюю страницу, сеанс получает значение null. Я смущен, где делать сеанс, чтобы сохранить ценность для всех страниц.?ASP.NET, сохранение сеанса на pageload и postback

Вот мой код:

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. Вам не нужно ничего делать, чтобы перенести сеанс между страницами на одном сайте. –

+0

Hi David, Спасибо за ваш ответ, Я являюсь начальником в ASP.Net, поэтому я прошу вас быть легким для меня, но я знаю, что сеансы поддерживаются в ASP.Net, на самом деле мне нужно знать, где именно следует Я помещаю чек на свои переменные сеанса, чтобы различать администраторов или пользователей-членов, а также для поддержания этого значения сеанса? – user2126933

+0

Не проблема! На самом деле, я думаю, что ответ от @Hussein Roncevic очень хорошо взят - ASP.NET имеет возможности для управления большой частью этого вида домашнего хозяйства для вас, и это сделает ваш код намного проще в обслуживании. –

ответ

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 части, когда вы проверяете для PostBack, вы очищаете переменные сессии, а затем проверить их на нуль. Здесь нет никакого смысла. Они всегда будут нулевыми, и ваши if и else if никогда не произойдут. Переосмыслите свою стратегию и то, что вы хотите достичь.

Теперь мои комментарии относительно того, что вы пытаетесь сделать ... Прежде всего, использование сеанса таким образом - это нечто вроде того, что вы сделали бы в классическом ASP. С ASP.NET существуют гораздо лучшие механизмы для этого. Вместо этого вы должны использовать MembershipProvider и RoleProvider, чтобы аутентифицировать своих пользователей и отслеживать их. Вместо того, чтобы читать имя пользователя из переменной сеанса, вы обычно используете Page.User.Identity.Name для получения идентификатора пользователя или имени пользователя. В дополнение к этому вы можете использовать Roles.IsUserInRole() или какой-либо другой статический метод в классе Roles.

Во-вторых, вы повторяете свои имена переменных слишком много раз. То есть вы используете жестко закодированные строки, которые указывают на одно и то же в слишком многих местах. Ваше обслуживание будет беспорядочным. Пока вы еще на ранней стадии разработки, перейдите на FormsAuthentication, чтобы ASP.NET обрабатывал все вышеперечисленные задачи для вас.

UPDATE: 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

+0

Спасибо Husein за ваш ответ, на самом деле мне нужно поддерживать сеанс один для администратора, а другой для членов и на основе этих ролей мне нужно отображать/скрывать некоторые элементы, поэтому Я делаю сессии и поддерживаю их. И да, я получил эту точку для назначения нулевого значения в первом операторе if. Не могли бы вы рассказать мне, где именно использовать этот сеанс, чтобы проверить, является ли зарегистрированный пользователь Admin или членом? Заранее спасибо – user2126933

+0

Спасибо вам, ребята :) – user2126933

Смежные вопросы