ASP.Net: Benutzersteuerelemente, die dem Platzhalter dynamisch hinzugefügt wurden, können keine Werte abrufen

8

Ich füge dynamisch einige Benutzersteuerelemente zu einem PlaceHolder-Serversteuerelement hinzu. Meine Benutzersteuerung besteht aus einigen Beschriftungen und einigen Textboxsteuerelementen.

Wenn ich das Formular abschicke und versuche, den Inhalt der Textfelder (innerhalb jedes Benutzersteuerelements) auf dem Server anzuzeigen, sind sie leer.

Wenn das Postback abgeschlossen ist, haben die Textfelder die Daten, die ich vor dem Postback eingegeben habe. Dies sagt mir, dass der Text in den Boxen durch ViewState beibehalten wird. Ich weiß einfach nicht, warum ich sie beim Debuggen nicht finden kann.

Kann mir bitte jemand sagen, warum ich die Daten nicht sehen würde, die der Benutzer auf dem Server eingegeben hat?

Danke für jede Hilfe.

    
Steve Horn 19.09.2008, 14:53
quelle

8 Antworten

9

Dies basiert auf der .NET v1-Ereignissequenz, aber es sollte Ihnen die Idee geben:

  • Initialisieren (Init-Ereignis)
  • Beginne Tracking-Zustand (überprüft, ob Postback)
    • Lade Ansichtszustand (wenn Postback)
    • Postback-Daten laden (wenn Postback)
  • Laden (Ereignis laden)
    • Geänderte Ereignisse (wenn Postback) auslösen
    • Raise Postback Events (wenn Postback)
  • PreRender (PreRender-Ereignis)
  • Ansichtszustand speichern
  • Rendern
  • Entladen (Ereignis entfernen)
  • Entsorgen

Wie Sie sehen, erfolgt das Laden von ViewState-Daten zurück zu den Steuerelementen vor dem Load-Ereignis. Damit Ihre dynamisch hinzugefügten Steuerelemente diese Werte "beibehalten" können, müssen sie vorhanden sein, damit die ASP.NET-Seite die Werte zuerst erneut laden kann. Sie müssten diese Steuerelemente in der Init-Phase neu erstellen, bevor der Ladezustand angezeigt wird.

    
icelava 19.09.2008, 15:07
quelle
3

Ich habe gestern herausgefunden, dass Sie Ihre App wie gewohnt funktionieren lassen können, indem Sie den Kontrollbaum laden, nachdem das loadviewstateevent ausgelöst wurde. Wenn Sie das Ereignis loadviewstate überschreiben, rufen Sie mybase.loadviewstate auf und fügen Sie anschließend Ihren eigenen Code ein, um die Steuerelemente unmittelbar danach neu zu generieren. Die Werte für diese Steuerelemente stehen beim Laden der Seite zur Verfügung. In einer meiner Apps verwende ich ein Viewstate-Feld, um die ID oder die Array-Informationen zu halten, mit denen diese Steuerelemente neu erstellt werden können.

%Vor%     
Middletone 16.07.2009 13:19
quelle
2

Ich glaube, dass Sie das Benutzersteuerelement zu dem PlaceHolder während der Init-Phase des Seitenlebenszyklus hinzufügen müssen, um den ViewState von der Ladephase zu füllen, um diese Werte zu lesen. Ist das die Reihenfolge, in der Sie diese laden?

    
bdukes 19.09.2008 14:56
quelle
1

Stellen Sie sicher, dass Sie Ihre dynamischen Steuerelemente auf Klassenebene definieren und sie dem ASP-Container hinzufügen:

%Vor%

Wenn Sie das Steuerelement instanziieren, stellen Sie sicher, dass Sie LoadControl aufrufen, damit das Objekt ordnungsgemäß hinzugefügt wird:

%Vor%     
Chris Porter 19.09.2008 15:08
quelle
0

Sie müssen Ihre Steuerelemente im Page_PreInit-Ereignishandler erstellen. Das ASP.NET-Serversteuerungsmodell ist schwierig. Sie müssen den Seitenlebenszyklus vollständig verstehen, um es richtig zu machen.

    
Will 19.09.2008 14:58
quelle
0

Wie andere schon gesagt haben, muss jede Art von Steuermanipulation durchgeführt werden, bevor der Viewstatus erstellt wird.

Hier ist ein guter Link zum Seitenlebenszyklus, um Ihnen zu helfen:

Ссылка

    
FlySwat 19.09.2008 15:01
quelle
0

Wir haben das gleiche erlebt und haben es mit ghost controls auf page_load behandelt, die genau die gleiche .ID haben, und dann nimmt der Post-back die Ereignisse und die Daten auf. Wie andere sagten, ist es das dynamische Hinzufügen des Steuerelements nach den Initialisierungsphasen, dass der Status bereits erstellt wurde und die Steuerelemente nach dem Hinzufügen nicht gespeichert werden.

Hoffe, das hilft ein bisschen.

    
osp70 19.09.2008 15:14
quelle
0

Ich möchte auch hinzufügen, dass Benutzersteuerelemente so funktionieren, wie Sie es erwarten würden, indem Sie die Eigenschaft "Control.ID" zur Laufzeit setzen. Wenn Sie die ID nicht festlegen, werden Elemente möglicherweise in einer anderen Reihenfolge erstellt und arbeiten merkwürdig.

    
proudgeekdad 04.05.2009 21:54
quelle

Tags und Links