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:
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
. 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
. 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.
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.
Ich glaube nicht, dass ich etwas hinzufügen kann, das dieser Artikel nicht behandelt.
Sehen Sie sich speziell den Abschnitt Lebenszyklus-Ereignisse an.
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.
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.
Tags und Links c# asp.net user-controls viewstate