2009-08-21 11 views
8

Rozważmy następujący kod:ASP.NET prywatne pole członek traci wartość na odświeżenie

public partial class TeacherControlPanel : System.Web.UI.Page 
    { 
     protected string username = string.Empty; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      username = (string)Request.QueryString["username"]; 

      Ice_Web_Portal.BO.Teacher teacher = Ice_Web_Portal.BO.Teacher.GetTeacherByUsername(username); 

      if (teacher != null) 
      { 
       labUsername.Text = username; 
       labName.Text = teacher.TeacherName; 
       labTeacherCode.Text = teacher.TeacherCode; 

       Dept dept = teacher.Department; 

       if (dept != null) 
       { 
        labDepartment.Text = dept.DeptName; 
       } 
      } 
      else 
      { 
       //labErrorMessage.Text = "No teacher found"; 
      } 
     } 

     protected void btnSendMail_Click(object sender, EventArgs e) 
     { 
      Response.Redirect(@"~/Teacher/TeacherComposeMail.aspx?username=mahabub" + username);    
     } 
} 

w tym kodzie, kiedy jestem oświadczając „login” jako prywatne, jest zerowane po kolejnych plecami pocztowych.

Dlaczego?

Jaki jest sekret?

+1

Czy mówisz, że kod działa tak, jak zapisano, ale kiedy zmienisz nazwę użytkownika na zmienną prywatną, to się nie powiedzie? –

+0

Czy jest inicjalizowany na wartość null lub string.Empty? – Martin

+0

@Martin, jest pusty. – anonymous

Odpowiedz

15

Ponieważ ASP.NET jest bezstanowy, nie utrzymuje stanu z powrotem do postback. Zapisz użytkownika w widoku, sesji lub aplikacji, aby wyświetlić go na poczcie zwrotnej do odświeżenia.

#region UserName 
public string UserName 
{ 
    get 
    { 
     if (this.ViewState["UserName"] == null) 
      return string.Empty; 

     return (string)this.ViewState["UserName"]; 
    } 
    set { this.ViewState["UserName"] = value; } 
} 
#endregion 
+0

, ale robi 'username = (ciąg) Request.QueryString [" nazwa użytkownika "];' przy każdym ładowaniu strony. – Kobi

+0

@ David Basarab, nie żądam rozwiązania. Próbuję poznać różnicę efektu btwn. chronione vs prywatne w tym przypadku. – anonymous

5

każdym razem robić żadnych odświeżenie strony, nawet dla „prostych” rzeczy jak kliknięcie przycisku wydarzeń, pracujesz z nowej instancji klasy widoku. To jest ASP.Net 101.

+0

Jeśli przekierowujesz do nowej strony lub ładujesz stronę z nowym ciągiem zapytania, to nie jest odświeżenie strony. Jeśli przetwarzasz zdarzenie click button na stronie z ciągiem zapytania, to jest odświeżenie, a ciąg zapytania jest wysyłany z żądaniem http odświeżenia. Tak czy inaczej, wciąż jest to nowa instancja klasy strony. –

+0

Nie znalazłem odpowiedzi dotyczącej chronionej lub prywatnej. – anonymous

1

Zgłoszenie pola nazwy użytkownika jako prywatnego lub chronionego nie ma wpływu na tę sytuację. Jedynym zabezpieczeniem/prywatnym byłoby posiadanie dostępnej zmiennej poza klasą lub odziedziczonymi elementami.

Uważam, że jest to prawdopodobnie problem związany z cyklem życia.

Podczas pierwszej nawigacji do tej strony, nazwa użytkownika będzie miała tylko wartość, jeśli dla zapytania wybrano ciąg zapytania. Tak więc "/TeacherControlPanel.aspx" będzie mieć nazwę użytkownika bez wartości, ale "/TeacherControlPanel.aspx?username=SomeUserName". W takich przypadkach nazwa użytkownika pola będzie miała wartość tylko wtedy, gdy jest ustawiona. Jeśli nie ma ustawionego querystringu, to gdy strona przetwarza zdarzenie click button, ładunek zostanie uruchomiony, żaden ciąg znaków zapytania nie będzie oznaczał, że nazwa użytkownika będzie miała wartość null, co oznacza, że ​​zdarzenie click nie będzie miało nic do dodania do ciągu przekierowania.

Pytanie więc, w twojej aplikacji, jaką ścieżkę nawigacji używasz, aby dostać się do TeacherControlPanel.aspx?

+2

dodatkowo na stronie widoczne będzie chronione pole (TeacherControlPanel.aspx, na oświadczeniach <% %>), podczas gdy prywatne pole nie jest. – Kobi

Powiązane problemy