2009-07-07 13 views
8

Je ne sais pas beaucoup sur ASP.Net mais j'essaye de faire un nouveau contrôle pour une boîte de message. Vous entrez des informations et appuyez sur un bouton.ASP.Net: Page_Load() étant appelé plusieurs fois

Cependant, pour une raison bizarre lorsque le bouton est enfoncé, Page_Load() est appelé une deuxième fois, et toutes les variables membres sont réinitialisées à null! J'ai besoin de ces variables, et Page_Load() n'a pas de raison d'être appelé une seconde fois! Bien sûr, la callstack est inutile.

+0

Pourquoi la pile d'appels est-elle inutile? Veuillez en poster une copie afin que nous puissions voir qui a initié l'appel à votre méthode de chargement. –

+0

Avez-vous javascript faire un appel webmethod? – NotMe

+0

Tout ce qu'il montre ci-dessus Page_Load() est [Code externe] – evilfred

Répondre

16

Rappelez-vous, en ASP.Net chaque fois que vous causer une publication de toute nature, y compris la gestion des événements tels que les clics de bouton, vous travaillez avec une marque nouvelle instance de votre classe de page qui doit être reconstruite à partir de zéro. Tout travail que vous avez effectué précédemment pour construire la page sur le serveur est disparu. Cela signifie exécuter le cycle de vie complet de la page , y compris le code de chargement de la page, et pas seulement le code de clic.

Toujours deux, il n'y en a pas, pas plus, pas moins. Une demande et une réponse.

+1

guhhh donc les variables d'instance sont inutiles? C'est bizarre parce que j'ai fait exactement la même chose ailleurs dans la page Web et ils fonctionnent bien, je ne suis pas arrivé à frapper la ré-instantané là d'une manière ou d'une autre je devine. – evilfred

+1

Les variables d'instance sont utiles pour conserver les données entre les événements dans la même publication. Par exemple, vous pouvez ouvrir une connexion SQL au début et utiliser la même connexion plus tard dans le cycle de vie. Lorsque les variables d'instance fonctionnent ailleurs dans les publications, vous utilisez probablement ViewState. –

+0

+1 pour avoir pensé à la chose * la plus évidente * plutôt que de passer par des spéculations plus avancées! –

4

Lorsque la page publie, la méthode Page_Load est appelée. Ensuite, une fois que le serveur traite réellement la page et vous envoie un nouveau basé sur les modifications, le Page_Load est appelé à nouveau, en fait la première fois sur la nouvelle page qui vous est envoyée.

Donc, si vous tirez des données en cas Page_Load ou le réglage des valeurs, placez-le dans le bloc suivant:

if(!Page.IsPostBack) 
{ 

} 

pour préserver une partie de votre état. Sinon, les instructions que vous avez placées dans l'événement Page_Load s'exécuteront à chaque fois.

Il permet de revoir le cycle de vie de la page ASP.Net :)

0

Juste un coup de feu dans l'obscurité, mais peut-être ajouter ceci après votre page_load:

if (!IsPostBack) 
{ 
1

Comme mentionné Joel, les variables d'instance seront perdus une fois que la page est envoyée au client. Cependant, il existe différentes méthodes pour stocker les valeurs de vos variables afin que vous puissiez les récupérer plus tard. Cette page sur State Management est un bon point de départ si vous voulez en savoir plus.

1

Toute étiquette/élément qui nécessite une référence d'URL comme img, ancre, objet, etc. doit être vérifié pour la référence vide.

par exemple. href = "", url = "", src = "" sont quelques erreurs courantes.

1

Ce code fonctionne pour moi:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     if (Session["something"] == null) 
     { 
      Session["something"] = "1"; 
     } 
     else 
     { 
      Session["something"] = null; 

      //your page load code here 

     }    
    } 
} 
1

Pour moi, la question est un peu compliqué, mais je trouve que le gestionnaire

protected override void OnPreRender(EventArgs e)

est appelée une seule fois, il est donc plus sûr mettre des actions là-dedans si ce n'est pas trop tard pour vous.

-1

vous pouvez utiliser des sessions ou viewstate pour conserver les valeurs des variables ..

  1. si vous souhaitez rediriger vers une autre page, utilisez session []
  2. autre si vous voulez rester sur le même page, utilisez viewstate []
Questions connexes