2009-10-13 9 views
20

Aujourd'hui, j'ai lancé une petite application Web asp.net beta qui permet au personnel interne de modifier certaines informations sur les produits. Nous avons commencé à nous heurter à des problèmes où les utilisateurs écrasaient les informations sur les autres produits ... même si chaque membre du personnel modifiait une ligne totalement différente (Produit).ASP.NET C# Les variables statiques sont globales?

Après quelques recherches sur google, je pense que je sais ce qui se passe, son rapport avec l'utilisation de variables statiques, ci-dessous est un exemple grossier rapide du problème:

// EditProductGroup.aspx.cs 
public partial class EditProductGroup : System.Web.UI.Page 
{ 

    private static int _groupId = 0; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     _groupId = Convert.ToInt16(Request.QueryString["GroupID"]); 

    // get existing ProductGroup information from database using 
    //_groupId to find the row and populate textboxes 
    } 

    private void saveProductGroupData() 
    { 
     // when user hits 'save changes' button, update row 
     //where the primary key column 'ProductGroupID' matches _groupId in the table 
    } 
} 

Ainsi, selon Dans ma recherche, une variable statique existe réellement pour l'application dans son ensemble, ce qui signifie que si plusieurs utilisateurs utilisent l'application, ils lisent tous la même valeur pour '_groupId' et, dans certains cas, la définissent différemment valeur entraînant l'enregistrement d'une autre page de la page par une autre instance de la page (ProductGroupId). Mon intention était que la variable statique est isolée des autres utilisateurs, et ne devrait pas intefere - chaque utilisateur a leur propre instance de la page ainsi que leur propre instance de la variable '_groupId'. Heureusement, tout se passait sur une base de données de dev/staging et non sur la base de données en temps réel. Je ne suis pas sûr si j'ai juste besoin de déposer le mot-clé «statique» pour arrêter la variable étant définie/lu par tout le monde.

Des pensées? Merci

Répondre

22

Oui, dans ASP.NET une durée de vie des champs statiques est pour le domaine de l'application (notez que cela diffère un peu pour les types génériques).

Je vous recommande d'utiliser le serveur Session pour le stockage des données que vous souhaitez associer à une instance d'une session de navigateur client (connexion utilisateur). -à-dire

Session["_groupID"] = Convert.ToInt16(Request.QueryString["GroupID"]); 

vous pouvez le récupérer en faisant:

short groupID = Convert.ToInt16(Session["_groupID"]); 
+0

Merci Adam .... la seule chose est, je n'ai pas vraiment besoin de stocker cela pour une utilisation dans d'autres pages, je voudrais juste stocker le contenu de 'Demande.QueryString ["GroupID"] 'dans une variable que je peux utiliser n'importe où dans cette page ... sans qu'elle soit modifiée par les instances de la page de l'utilisateur' other '... Serait "private _groupId" (en omettant le mot-clé static) pour ça? Si non, je suppose que je pourrais utiliser des sessions. Merci pour la contribution! – Dal

+1

Dal - Les variables de session, comme vous le suspectez, sont conservées indépendamment de la page affichée pour l'intégralité de la session du navigateur client (à moins que vous ne les expiriez manuellement). Vous pouvez utiliser ViewState pour stocker la valeur, mais elle est diffusée au client (avec ses paramètres par défaut), donc il y a une chance qu'elle puisse être mucked avec (même improbable). ViewState conserverait la valeur par page. Y a-t-il une raison pour laquelle vous ne pouvez pas continuer à utiliser la valeur QueryString que vous utilisez initialement? Pour votre situation, je recommanderais QueryString, ViewState, HiddenField ou Session pour le stockage. –

+1

Merci pour la réponse rapide. L'application a été modifiée pour utiliser la chaîne de requête directement plutôt que de la pousser dans une variable donc oui je pense que je continuerai à utiliser cette méthode (QueryString). J'étais simplement curieux de savoir si mon implémentation originale fonctionnerait sans le mot-clé static. Merci beaucoup! :) – Dal

2

variables statiques a la même durée de vie en tant que domaine d'application, ils ont été créés dans Donc, si vous obtenez quelques mauvaises valeurs qu'il peut y avoir quelques problèmes. dans la logique d'application ou sinon. Vous devez utiliser SessionState pour les données par utilisateur.

18

Il est incorrect de dire qu'une variable statique existe dans l'ensemble de l'application. En fait, ils existent à deux niveaux différents

  1. Pour les types non génériques il y a une seule variable statique par AppDomain
  2. Pour les types génériques, il est un par instanciation générique par AppDomain

Une application peut contient de nombreux AppDomains et est vrai dans plusieurs types d'applications.

Si vous souhaitez toutefois stocker des paramètres spécifiques à l'utilisateur, utilisez une variable de session.

Questions connexes