2009-08-21 16 views
8

Considere el siguiente código:ámbito privado miembro de ASP.NET pierde valor en la devolución de datos

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);    
     } 
} 

En este código, cuando estoy declarando 'nombre de usuario' como privada, se inicializa a cero después de colocar la espalda posteriores.

¿Por qué?

¿Cuál es el secreto?

+1

¿Está diciendo que el código funciona como está escrito, pero cuando cambia el nombre de usuario a una variable privada, falla? –

+0

¿Se inicializa a nulo o cadena? ¿Vacío? – Martin

+0

@Martin, es nulo. – anonymous

Respuesta

15

Porque ASP.NET es sin estado, lo que significa que no lo mantiene en estado desde la publicación a la devolución de datos. Guarde al usuario en viewstate, sesión o aplicación para verlo en la devolución a la devolución de datos.

#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

pero él está haciendo 'username = (cadena) Request.QueryString [" username "];' en cada carga de página. – Kobi

+0

@David Basarab, no estoy solicitando una solución. Estoy tratando de saber la diferencia de efecto btwn. protegido contra privado en este caso. – anonymous

5

Cada vez que lo hace cualquier devolución de datos, incluso para las cosas "simples" como eventos de clic de botón, que está trabajando con un nueva instancia de la clase página. Eso es ASP.Net 101.

+0

Si redirige a una nueva página o carga una página con una nueva cadena de consulta, eso no es una devolución de datos. Si procesa un evento de clic de botón en una página con una cadena de consulta, se trata de una devolución de datos y la cadena de consulta se envía con la solicitud http de devolución de datos. De cualquier manera, sigue siendo una nueva instancia de la clase de página. –

+0

No encontré mi respuesta relacionada protegida contra privada. – anonymous

1

Declarar el campo de nombre de usuario como privado o protegido no tiene relación con esta situación. El único rumbo protegido/privado que tendría es la accesibilidad de la variable fuera de la clase o en miembros heredados.

Creo que este es un problema del ciclo de vida.

Al navegar a esta página por primera vez, el nombre de usuario solo tendrá un valor si la cadena de consulta se configuró para la solicitud. Entonces, "/TeacherControlPanel.aspx" tendrá un nombre de usuario sin valor, pero "/TeacherControlPanel.aspx?username=SomeUserName". En estos casos, el nombre de usuario del campo solo tendrá un valor si se establece uno. Y si no se establece ninguna cadena de consulta, cuando la página procesa el evento de clic de botón, la carga se activará, ningún conjunto de cadena de consulta significa que el nombre de usuario será nulo, lo que significa que el evento de clic no tendrá nada que agregar a la cadena de redirección.

Entonces, la pregunta es, en su aplicación, ¿qué ruta de navegación está utilizando para llegar a TeacherControlPanel.aspx?

+2

Además, un campo protegido será visible en la página (TeacherControlPanel.aspx, en <% %> declaraciones), mientras que un campo privado no lo es. – Kobi

Cuestiones relacionadas