2008-09-19 6 views
8

Ich füge einige Benutzersteuerelemente dynamisch zu einem PlaceHolder-Serversteuerelement hinzu. Meine Benutzersteuerung besteht aus einigen Beschriftungen und einigen Textboxsteuerelementen.ASP.NET: Benutzersteuerelemente, die dem Platzhalter dynamisch hinzugefügt wurden, können keine Werte abrufen

Wenn ich das Formular absende 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.

Antwort

9

Das auf .NET v1 Ereignisfolge basiert, aber es sollte Ihnen die Idee geben:

  • initialisieren (Init-Ereignis)
  • Tracking-Start View State (prüft, ob Postbacks)
    • Last View State (wenn Postbacks)
    • Lastpostback-Daten (wenn Postbacks)
  • Load (Load-Ereignis)
    • Raise Changed Ereignisse (wenn Postbacks)
    • Raise Postback-Events (wenn Postbacks)
  • PreRender (PreRender Ereignis)
  • Save View State
  • Render
  • Unload (Unload-Ereignis)
  • Entsorgen

Wie Sie sehen können, geschieht das Laden von Daten zurück Viewstate zu den Kontrollen vor dem Load-Ereignis. Damit Ihre dynamisch hinzugefügten Steuerelemente diese Werte "beibehalten" können, müssen sie present für die ASP.NET-Seite sein, um die Werte an erster Stelle neu zu laden. Sie müssten diese Steuerelemente in der Init-Phase neu erstellen, bevor der Ladezustand eintritt.

+2

Ich habe festgestellt, dass das Steuerelement mit der gleichen ID neu erstellt werden muss. In manchen Situationen scheint es nicht das Gleiche zu sein ... also betrüge und schreibe ich es, was funktioniert, ist aber unglaublich unelegant. –

2

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

0

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

1

Stellen Sie sicher, Sie dynamische Steuerelemente auf Klassenebene definieren und sie an den ASP Container hinzu:

Private dynControl As ASP.MyNamespace_MyControl_ascx 

Und wenn Sie das Steuerelement instanziiert, stellen Sie sicher, Loadcontrol aufrufen, um das Objekt richtig hinzugefügt wird:

0

Wir haben die gleiche Sache erlebt und haben es durch die Verwendung von Ghost-Controls auf page_load behandelt, die genau die gleiche .ID haben, und dann nimmt der Post 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, die hinzugefügt wurden, nicht gespeichert werden.

Hoffe das hilft ein bisschen.

0

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

3

Ich habe gestern herausgefunden, dass Sie Ihre App tatsächlich normal funktionieren lassen können, indem Sie den Kontrollbaum direkt nach dem Laden des loadviewstateevent laden. 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 speichern, die zum Erstellen dieser Steuerelemente verwendet werden können.

Protected Overrides Sub LoadViewState(ByVal savedState As Object) 
    MyBase.LoadViewState(savedState) 
    If IsPostBack Then 
     CreateMyControls() 
    End If 
End Sub 
+0

Nice one - es scheint kontraintuitiv, dass wir die Steuerelemente erstellen/nachdem/ViewState geladen ist - aber es funktioniert einfach nur gut. –