2009-03-23 4 views
0

Je suis vraiment confus avec ce comportement. Quelqu'un peut m'expliquer cela?Peut accéder à un objet après la publication - ASP.NET

J'ai la structure de classe suivante:

public abstract BaseUserControl : System.Web.UI.UserControl 
{ 
    public List<string> listFieldMapper = new List<string>(); 
} 

    public partial class Property : BaseUserControl 
    { 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

     base.listFieldMapper.Add("test"); 
    } 
    } 

Dans un gestionnaire d'événements d'un bouton, (causes Postback), je peux accéder à la base.listFieldMapper

Je crois comprendre que entre postbacks, l'État est pas maintenu, pour pouvoir maintenir l'état, utilisez l'objet ViewState. Comment est-ce que la liste maintient les valeurs? Sur une note de côté, Si vous définissez la valeur base.listFieldMapper après OnInit (Ex: chargement), j'ai un objet nul après la publication.

Répondre

2

Je pense que quand un bouton clic appelle un postback:

  1. Lorsque le serveur gère la demande, une instance du contrôle utilisateur est instancié.
  2. Le serveur appelle ensuite la méthode qui gère le clic sur le bouton.

Lorsque la page est demandée (pas de manipulation d'un bouton clic):

  1. Lorsque le serveur gère la demande, une instance du contrôle utilisateur est instancié.
  2. Le serveur appelle ensuite la méthode qui gère l'événement Load.
+0

L'événement OnLoad est appelé toujours (postback ou non) – Ruslan

+0

Oui, Rusian est exact. Je ne suis pas sûr de ce que cela pourrait causer. – DotnetDude

1

Le ViewState ne joue pas un rôle ici. Pour qu'il puisse tracer n'importe quoi, vous devez y mettre quelque chose (la plupart des propriétés par défaut le font).

Dans votre cas, la séquence d'événements dans le premier cas est (réglage de la liste sur init):

Dans le second cas
Control.OnInit -> add value 
Page.OnInit -> value present 
Page.OnLoad -> value present 
Control.OnLoad -> value present 
#PostBack 
Control.OnInit -> add value 
Page.OnInit -> value present 
Page.OnLoad -> value present 
Control.OnLoad -> value present 
Button.OnClick -> value present 

(réglage de la liste de la charge):

Control.OnInit -> value absent 
Page.OnInit -> value absent 
Page.OnLoad -> value absent 
Control.OnLoad -> add value 
#PostBack 
Control.OnInit -> value absent 
Page.OnInit -> value absent 
Page.OnLoad -> value absent 
Control.OnLoad -> add value 
Button.OnClick -> value present 

Et le listFieldMapper lui-même est assigné dans le constructeur de classe et sera non nul à n'importe quel point dans le cycle de vie du contrôle.

+0

Dans le 2ème cas, la valeur est absente sur Button.OnClick – DotnetDude

+0

Alors quelque chose manque. J'ai copié votre code et cela fonctionne comme annoncé. Êtes-vous sûr de ne pas faire quelque chose ailleurs? – Ruslan

Questions connexes