Viewstate und Steuerelemente in ASP.NET

8

Ich habe vor ein paar Tagen eine Frage über Viewstate gestellt und nach ein paar Tests bin ich zu einigen Schlussfolgerungen / Ergebnissen gekommen. Aufgrund dieser Ergebnisse habe ich ein paar Fragen, wie jemand bestimmte Dinge tun würde.

Hier sind die Ergebnisse meiner Tests, die ich durchgeführt habe:

  1. Wenn usercontrolA von OnInit einer Seite geladen wird, ist sein Viewstate in OnLoad verfügbar. Alle anderen Steuerelemente, die usercontrolA von seiner OnInit lädt, haben ihren Viewstatus in ihrem OnLoad .
  2. bereit
  3. Wenn usercontrolA von OnLoad einer Seite geladen wird, ist sein Viewstate in OnPreRender verfügbar. Alle anderen Steuerelemente, die usercontrolA von seiner OnLoad lädt, haben ihren Viewstatus in ihrer OnPreRender .
  4. Wenn usercontrolA von einem Ereignis geladen wird (Beispiel: Klick auf die Schaltfläche. Ereignisse werden nach OnLoad und vor OnPreRender ausgelöst) einer Seite, dann ist sein Ansichtszustand nicht verfügbar. Alle anderen Steuerelemente, die usercontrolA loades hat, haben ihren Ansichtsstatus nicht verfügbar.

Also würden Sie in einer perfekten Welt immer alle Steuerelemente laden, die die Situation Nr. 1 verwenden, so dass ihr Sichtstatus auf ihrem OnLoad verfügbar ist. Wenn Sie ein Steuerelement von einem Klick auf eine Schaltfläche oder von einem OnLoad laden müssen, ist es dann leider nicht möglich, den Status viewstate vor OnPreRender stage zu erhalten?

Ich habe eine Reihe von Artikeln über viewstate gelesen und dachte, dass ich sie verstanden habe, aber an meiner aktuellen Anwendung, die usercontrols lädt, die andere usercontrols laden, habe ich eine echt harte Zeit, Viewstatus auf meinem Blatt zu bekommen in der Kette) usercontrol.

Alle Vorschläge und / oder Links sind willkommen.

    
BlueChameleon 01.02.2012, 16:26
quelle

4 Antworten

3

Es wird akzeptiert, dynamische Steuerelemente in OnInit zu laden, damit sie den vollständigen Steuerungslebenszyklus erhalten. Ich bin mir nicht sicher, ob ich Ihre Situation wirklich verstehe. Wenn Sie ein Steuerelement auf Knopfdruck laden, warum sollte es dann einen Blickwinkel haben? Auf dem next OnInit sollten Sie das Steuerelement erneut laden (normalerweise verwende ich ein Viewstate-Element auf Seitenebene, um nachzuverfolgen, dass ein bestimmtes Steuerelement geladen werden muss), damit < em> Wiederherstellen von Viewstate. Etwas wie:

%Vor%

Das etwas interessantere Detail ist jedoch, dass es nach den Ereignissen der Fall ist - es sollte eigentlich keine Rolle spielen. Der Aufrufstack für das dynamische Laden eines Steuerelements sieht etwa so aus:

%Vor%

Wenn Sie Label als Beispiel nehmen, wird LoadViewState überschrieben und die Eigenschaft Text direkt von ViewState abgerufen. TextBox ist ähnlich. Also, nach meinem Lesen sollte es OK sein, an jeder Stelle hinzuzufügen und dann auf ViewState zuzugreifen. Das scheint jedoch nicht mit meiner Erfahrung zu funktionieren, so dass weitere Untersuchungen gerechtfertigt erscheinen.

    
Mark Brackett 01.02.2012, 17:14
quelle
4

Ich glaube nicht, dass ich etwas hinzufügen kann, das dieser Artikel nicht behandelt.

Sehen Sie sich speziell den Abschnitt Lebenszyklus-Ereignisse an.

Ссылка

    
Doug Chamberlain 01.02.2012 16:32
quelle
1

Ich bin überrascht, aber interessiert an Ihren Ergebnissen. Wenn ich mit dynamischen Steuerelementen arbeite, füge ich sie immer in Page_Init hinzu. Alles andere funktioniert nicht. Aber Sie haben recht - wie machen Sie das, wenn Sie sie als Reaktion auf einen Klick hinzufügen.

Der einzige Weg, den ich gefunden habe, ist, die Request.Form("__EVENTTARGET") sammlung bei PageInit zu untersuchen. Dies enthält die Steuerelement-ID des Steuerelements, das das Postback ausgelöst hat, also beispielsweise einen Klick auf die Schaltfläche. Es wird natürlich durch die Benennungscontainer, in denen es angezeigt wird, qualifiziert. Sobald Sie das 'Ereignis' mit dieser Methode identifiziert haben, können Sie die gewünschten Steuerelemente hinzufügen.

Es ist natürlich alles ein bisschen hacky, aber es ist der einzige Weg, den ich gefunden habe, diese Dinge zu tun. Es funktioniert.

Es ist interessant, dass ViewState auf PreRender verfügbar ist, wenn Sie die Steuerelemente in Page_Load hinzufügen. Aber wie der obige Link anzeigt, ist es zu spät, um Ihnen dann zu helfen. Der Steuerzustand wird während des Lastzyklus rehydriert. Wenn es nicht dort ist, werden dein Kontrollstatus oder deine dynamischen Steuerelemente einfach verschwinden.

    
Crab Bucket 01.02.2012 16:36
quelle
0

Haben Sie versucht, LoadComplete event? zu verwenden?

Verwenden Sie dieses Ereignis für Aufgaben, bei denen alle anderen Steuerelemente auf der Seite geladen werden müssen.

Dies wird nach PageLoad und allen Ereignissen (ButtonClick usw.) ausgelöst, sodass Ihre Benutzersteuerelemente in ButtonClick-Ereignissen geladen werden und in LoadComplete ihr ViewState bereits initialisiert ist.

    
Leon 01.02.2012 16:47
quelle