2009-03-23 22 views
0

Ich bin wirklich mit diesem Verhalten verwirrt. Kann mir das jemand erklären?Zugriff auf ein Objekt nach dem Postback - ASP.NET

Ich habe die folgende Klassenstruktur:

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"); 
    } 
    } 

In einem Ereignishandler einer Schaltfläche (verursacht Postback), kann ich den Zugriff auf base.listFieldMapper

Mein Verständnis war, dass zwischen Postbacks, der Staat Um den Status beizubehalten, verwenden Sie das ViewState-Objekt. Wie kommt es, dass die Liste die Werte beibehält?

Auf einer Randnotiz, wenn ich den Wert base.listFieldMapper nach OnInit (Bsp .: laden), habe ich ein Null-Objekt nach dem Postback.

Antwort

2

würde ich denken, wenn eine Schaltfläche, um eine Postbacks ruft:

  1. Wenn der Server die Anforderung Handhabung wird eine Instanz des Benutzersteuer instanziiert wird.
  2. Der Server ruft dann die Methode auf, die den Klick auf die Schaltfläche verarbeitet.

Wenn die gewünschte Seite (nicht auf einen Knopf klicken Handhabung):

  1. Wenn der Server die Anfrage ist der Umgang, eine Instanz des Benutzersteuer instanziiert wird.
  2. Der Server ruft dann die Methode auf, die das Load-Ereignis behandelt.
+0

Das OnLoad-Ereignis wird immer aufgerufen (Postback oder nicht) – Ruslan

+0

Ja, Rusian hat Recht. Ich bin mir nicht sicher, was das verursachen könnte. – DotnetDude

1

Der ViewState spielt hier keine Rolle. Um etwas zu verfolgen, müssen Sie etwas hineinlegen (die meisten Standardeigenschaften tun dies).

In Ihrem Fall die Abfolge der Ereignisse im ersten Fall (Einstellung die Liste auf init):

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 

Im zweiten Fall (die Liste auf Lasteinstellung):

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 

Und der listFieldMapper selbst wird im Klassenkonstruktor zugewiesen und ist zu keinem Zeitpunkt im Lebenszyklus des Steuerelements nicht null.

+0

Im zweiten Fall fehlt der Wert auf Button.OnClick – DotnetDude

+0

Dann fehlt etwas. Ich habe Ihren Code kopiert und funktioniert wie angekündigt. Bist du sicher, dass du etwas woanders nicht machst? – Ruslan

Verwandte Themen