Alcance de las variables de ASP.Net
Pregunta
Tengo un problema extraño relacionado con el alcance de las variables. He declarado una variable de la siguiente manera:
public partial class MyClass: System.Web.UI.Page
{
protected static int MyGlobalVariable;
protected void MyFunction()
{
MyGlobalVariable = 1;
}
}
Y esto funciona bien en el funcionamiento de mi página. Sin embargo, cuando dos usuarios están usando la misma página, encuentro que me estoy cruzando. Si un usuario estableciera la variable en 5 y el otro uso luego accediera a esa variable, se establecería en 5. ¿Cómo puedo configurar la variable para que solo sea accesible para el usuario que la estableció originalmente?
Solución
Si declara MyGlobalVariable
como estático, solo existirá una instancia para todas las instancias de la clase, por lo que, como ha dicho, varios usuarios, en varias instancias de la misma página, accederán el mismo valor.
declare el int sin el modificador static
o si necesita que persista para ese usuario, considere usar Viewstate
(para el alcance de la página) o Session
(para el alcance de la sesión)
por ejemplo
protected int MyGlobalVariable
{
get
{
return ViewState["MyGlobalVariable"] != null ? Convert.ToInt32(ViewState["MyGlobalVariable"] : 0;
}
set
{
ViewState["MyGlobalVariable"] = value;
}
}
o
protected int MyGlobalVariable
{
get
{
return Session["MyGlobalVariable"] != null ? Convert.ToInt32(Session["MyGlobalVariable"] : 0;
}
set
{
Session["MyGlobalVariable"] = value;
}
}
Otros consejos
Eliminar la declaración estática:
protected int MyGlobalVariable;
Más información en Variables estáticas
Nunca uses variables ESTÁTICAS en tus páginas.
Las variables estáticas utilizan internamente la misma dirección de memoria. Así que todos los usuarios obtendrán el mismo valor almacenado.
Bueno, si usas esto para necesitar varilables 'públicos'. Entonces necesitarás usar algunos trucos como viewstate o session.