OVH Cloud OVH Cloud

[Q] Attributs/membres des classes hérités de Page

2 réponses
Avatar
Christian Montpellier
Petit problème sur la programmation ASP.NET :

J'ai une classe sur le modèle suivant :
public class Test : System.Web.UI.Page

{

// attributs ajoutés via l'IDE VS

protected System.Web.UI.WebControls.TextBox txbUserId;

protected System.Web.UI.WebControls.Button btnExecuteOperation;

// attribut ajouté à la main :

protected int Compteur;

private void Page_Load(object sender, System.EventArgs e)

{

if (!Page.IsPostBack)

Compteur=5;

}

....

}

Dans mon esprit le membre Compteur est initialisé à 5 lors du premier
chargement de la page aspx liée à ce code, et si je ne le touche pas par
ailleur cet attribut gardera constament cette valeur qui sera accessible
lors de tous les rechargement de la page suite à un postBack.

En réalité je me rend compte qu'à chaque rechargement de la page Compteur
vaut 0
Comment expliquer ce comportement ?
On dirait que l'objet Test était réinstancié à chaque chargement et les
membres réinitialisés.
Comment faire en sorte que mon attribut Compteur ne soit pas réinitialisé à
0 à chaque Page_Load ?
De manière plus générale je suis à la recherche d'un lien décrivant
l'instanciation et la vie des objets tels que l'objet Test au cours de
l'exécution d'une application ASP.NET.

Merci,

Christian

2 réponses

Avatar
Paul Bacelar
Là, je crois que Christian a une vue quelque peu idyllique d'ASP.NET.

-Premièrement, un int est toujours initialisé à 0.

-Secondo, le compteur n'est initialisé à 5 que dans la méthode Page_Load,
c'est à dire bien après la construction de la page.

-Tertio, la page web est instanciée à chaque requête, et donc compteur et
initialisé à 0.

-Quatrièmement, "Compteur" n'a pas la valeur qu'il avait dans l'instance de
la page qui a traité la précédente requête du même utilisateur car, dans le
ViewState de la page, la valeur de "Compteur" n'a pas été sauvegardé par
l'instance de la page précédente et donc pas récupéré par l'instance de la
page actuel, il n'y a pas de miracle, les concepteurs des WebControl se sont
simplement arrangé pour sauvegarder les données dans le ViewState pour
pouvoir les utiliser dans l'instance de la page qui suit.

-Cinquièmement, quand je dis que Page_Load, c'est longtemps après l'
instanciation de la class de la page, ce n'est pas une figure de style.

-Sixièmement, pour ton cas du compteur, il est plus pertinent d'utiliser la
propriété "State" de la page, pour éviter que ça valeur ne fasse la navette
entre le client et le serveur.



Voilà, désolé de t'avoir cassé ton rêve ;-)

--
Paul Bacelar
Demandeur d'emploi

"Christian Montpellier" wrote in message
news:

Petit problème sur la programmation ASP.NET :

J'ai une classe sur le modèle suivant :
public class Test : System.Web.UI.Page

{

// attributs ajoutés via l'IDE VS

protected System.Web.UI.WebControls.TextBox txbUserId;

protected System.Web.UI.WebControls.Button btnExecuteOperation;

// attribut ajouté à la main :

protected int Compteur;

private void Page_Load(object sender, System.EventArgs e)

{

if (!Page.IsPostBack)

Compteur=5;

}

....

}

Dans mon esprit le membre Compteur est initialisé à 5 lors du premier
chargement de la page aspx liée à ce code, et si je ne le touche pas par
ailleur cet attribut gardera constament cette valeur qui sera accessible
lors de tous les rechargement de la page suite à un postBack.

En réalité je me rend compte qu'à chaque rechargement de la page Compteur
vaut 0
Comment expliquer ce comportement ?
On dirait que l'objet Test était réinstancié à chaque chargement et les
membres réinitialisés.
Comment faire en sorte que mon attribut Compteur ne soit pas réinitialisé


à
0 à chaque Page_Load ?
De manière plus générale je suis à la recherche d'un lien décrivant
l'instanciation et la vie des objets tels que l'objet Test au cours de
l'exécution d'une application ASP.NET.

Merci,

Christian




Avatar
Patrice
Voir
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpguide/html/cpconControlExecutionLifecycle.asp
pour le cycle de vie (en français).

Pour des raisons de "ressources", tu comprendras qu'un serveur Web ne peut
pas conserver dans le temps l'état de chaque page demandée par chaque client
(de plus il ne peut pas savoir si la page sera encore accédée et donc si
c'est utile !).

Par essence, un serveur Web ne fait donc que répondre "ponctuellement" à une
chaque demande qui lui est faite (et en se basant uniquement sur la demande
en cours) même si quelques mécanismes existent pour simuler la continuité
(variables de session, d'application, cookie, champs de formulaire,
paramètres sur URL et j'en oublie peut-être)...

Patrice

--

"Christian Montpellier" a écrit dans le message de
news:

Petit problème sur la programmation ASP.NET :

J'ai une classe sur le modèle suivant :
public class Test : System.Web.UI.Page

{

// attributs ajoutés via l'IDE VS

protected System.Web.UI.WebControls.TextBox txbUserId;

protected System.Web.UI.WebControls.Button btnExecuteOperation;

// attribut ajouté à la main :

protected int Compteur;

private void Page_Load(object sender, System.EventArgs e)

{

if (!Page.IsPostBack)

Compteur=5;

}

....

}

Dans mon esprit le membre Compteur est initialisé à 5 lors du premier
chargement de la page aspx liée à ce code, et si je ne le touche pas par
ailleur cet attribut gardera constament cette valeur qui sera accessible
lors de tous les rechargement de la page suite à un postBack.

En réalité je me rend compte qu'à chaque rechargement de la page Compteur
vaut 0
Comment expliquer ce comportement ?
On dirait que l'objet Test était réinstancié à chaque chargement et les
membres réinitialisés.
Comment faire en sorte que mon attribut Compteur ne soit pas réinitialisé


à
0 à chaque Page_Load ?
De manière plus générale je suis à la recherche d'un lien décrivant
l'instanciation et la vie des objets tels que l'objet Test au cours de
l'exécution d'une application ASP.NET.

Merci,

Christian