Portée des variables ASP.Net
Question
J'ai un problème étrange lié à la portée des variables. J'ai déclaré une variable de la manière suivante:
public partial class MyClass: System.Web.UI.Page
{
protected static int MyGlobalVariable;
protected void MyFunction()
{
MyGlobalVariable = 1;
}
}
Et cela fonctionne bien sur le fonctionnement de ma page. Cependant, lorsque deux utilisateurs utilisent la même page, je me rends compte que je me fais traverser. Si un utilisateur définissait la variable sur 5 et que l'autre utilisait cette ressource, elle serait définie sur 5. Comment définir la variable de sorte qu'elle ne soit accessible qu'à l'utilisateur qui l'a configurée à l'origine?
La solution
Si vous déclarez MyGlobalVariable
comme statique, une seule instance de celle-ci existera pour toutes les instances de la classe. Par conséquent, comme vous l'avez dit, plusieurs utilisateurs, sur plusieurs instances de la même page, accéderont la même valeur.
déclarez l'intel sans le modificateur static
ou, si vous souhaitez le conserver pour cet utilisateur, envisagez d'utiliser Viewstate
(pour l'étendue de la page) ou Session <. / code> (pour la portée de la session)
par exemple
protected int MyGlobalVariable
{
get
{
return ViewState["MyGlobalVariable"] != null ? Convert.ToInt32(ViewState["MyGlobalVariable"] : 0;
}
set
{
ViewState["MyGlobalVariable"] = value;
}
}
ou
protected int MyGlobalVariable
{
get
{
return Session["MyGlobalVariable"] != null ? Convert.ToInt32(Session["MyGlobalVariable"] : 0;
}
set
{
Session["MyGlobalVariable"] = value;
}
}
Autres conseils
Supprimez la déclaration statique:
protected int MyGlobalVariable;
En savoir plus sur les Variables statiques
N'utilisez jamais de variables STATIC dans vos pages.
Les variables statiques utilisent la même adresse mémoire en interne. Ainsi, tous les utilisateurs auront la même valeur stockée.
Eh bien, si vous utilisez ceci et que vous avez besoin de variables «publiques». Ensuite, vous devrez utiliser des astuces telles que viewstate ou session.