la variable initialisée en classe perd sa valeur précédente avec le chargement de la page

J’ai déclaré un test de variable Ssortingng avec “hi”. chaque fois que je clique sur Button1, je pense que ce test sera ajouté à sa valeur précédente. Mais j’ai remarqué qu’il perd sa valeur précédente lorsque le bouton est cliqué et que la page est rechargée. C’est chaque fois que je clique dessus, son texte est “hihi”. J’attends “hihihihi” au prochain clic et ainsi de suite. Quel est le problème ici avec le code ci-dessous?

public partial class _Default : System.Web.UI.Page { Ssortingng test = "hi"; protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { test += test; Button1.Text = test; } } 

Non, ce n’est pas comme ça que asp.net fonctionne. Si vous avez besoin de ce comportement, vous devriez faire ceci:

 public ssortingng test { get { return (ssortingng) ViewState["test"] ?? "hi"; } set { ViewState["test"] = value; } } 

Lorsque ASP.NET envoie une demande au serveur, une nouvelle version de votre classe est instanciée. Si vous devez obtenir l’état, vous devez utiliser ViewState (qui est enregistré dans un champ caché dans le navigateur et envoyé avec chaque demande, et donc l’état enregistré par page ), ou vous pouvez utiliser SessionState qui est un état enregistré par utilisateur. . SessionState par défaut est enregistré en mémoire. Donc, si vous redémarrez IIS, cet état disparaîtra. Notez que l’état de viewstate ne disparaîtra PAS si vous réinitialisez IIS (car il est envoyé par le navigateur). Vous pouvez également utiliser le Cache qui, à nouveau, est enregistré en mémoire. Cet état concerne tous les utilisateurs de votre application. Les mêmes règles concernant la réinitialisation d’IIS s’appliquent. Enfin, vous pouvez rendre votre variable statique. Comme je l’ai dit, chaque fois qu’une requête est faite, une nouvelle version de votre classe est instanciée. Bien entendu, les variables statiques ne sont pas des variables d’instance. Par conséquent, l’état d’une variable statique est également enregistré dans les publications. Les mêmes règles concernant la réinitialisation d’IIS s’appliquent aux variables statiques telles que Cache et Session.

Un champ n’existe que pour la durée d’une seule demande. Si vous voulez qu’il vive entre les demandes, vous devrez utiliser quelque chose comme l’état de la session, l’état de la vue, un cookie ou une valeur de formulaire / demande HTML.

Dans la plupart des applications “réelles”, vous ne pouvez même pas garantir que les demandes suivantes sont traitées par la même machine physique .

Chaque fois que vous visitez une page, une nouvelle instance de la page est créée avec sa propre copie de votre variable locale. Vous pouvez conserver les valeurs d’une vue de page à l’autre de plusieurs manières. Elles sont toutes décrites ci-dessous: Présentation de la gestion d’état ASP.NET

 Ssortingng test = "hi"; 

Il s’agit d’un champ de classe d’instance privé.

Vous avez besoin d’un statique si vous voulez atteindre votre objective.

BTW, honnêtement, peut-être que vous cherchez à utiliser un élément de session:

 HttpContext.Current.Session["test"] = "hi"; 

En procédant ainsi, vous aurez un code comme celui-ci dans votre gestionnaire d’événements:

 ssortingng currentTestText = (ssortingng)HttpContext.Current.Session["test"]; currentTestText += currentTestText; Button1.Text = currentTestText; HttpContext.Current.Session["test"] = currentTestText; 

C’est parce qu’un bouton génère un POST BACK que vous pouvez déclarer la variable en tant que propriété statique ou créer une session [“Test”] ou append du code sur le clic du bouton si IsPostback {}

N’oubliez pas que lors d’une publication, asp.net recrée les objects et réaffecte les valeurs. Dans votre cas, la variable de test est recréée et reçoit la valeur ‘hi’. Vous voudrez peut-être stocker la variable en session, puis append la valeur.

Le problème avec votre code est que, à chaque requête, votre instance de Page est recréée afin que test ne conserve pas la valeur précédente, car elle appartient à une nouvelle instance de Page .

C’est le stream:

Demande 1 Start

 Page is created -> test = "hi" 

Demande 1 se termine

 Page is detroyed 

Demande 2 Start

 Page is created -> test = "hi" 

Demande 2 termine

 Page is detroyed 

Cela fonctionne, juste l’essayer

 // in the page load event if(!this.IsPostBack) Button1.Text = test; // in the Click event this.Button1.Text += test; 

Le problème avec votre code actuel est que vous affectez une variable d’instance au texte du bouton, car il s’agit d’une variable d’instance initialisée chaque fois que vous demandez la page avec la même valeur, c’est pourquoi vous obtenez toujours hihi uniquement et non hihihihihihihi.

Chaque fois que vous cliquez sur le bouton, ASP.Net crée une new Page() . Par conséquent, le membre de test est toujours initialisé comme suit: test = "hi"; .