2009-02-17 12 views
6

Was ich versuche, ist ein Webpart zu erstellen, das ein Textfeld enthält, in dem Sie den Wert eines Literals (h2) auf dem Webpart und eine Schaltfläche "Speichern" festlegen können, die zurücksetzt und dann das Literal entsprechend setzt. Dies funktioniert mit einer großen Einschränkung; Wenn die Seite nach dem Postback geladen wird, wurde das Literal nicht geändert. Wenn ich jedoch protokolliere, was im Literal tatsächlich eingestellt ist, hat es den neuen Wert. Auch wenn ich die Seite erneut lade (F5), wird sie korrekt angezeigt.Richtig ein Webpart mit Postback implementieren?

Zuerst dachte ich, es muss ViewState sein, also habe ich es für alle Kontrollen deaktiviert. Ich habe überprüft, dass es nicht im ViewState gespeichert (entschlüsselt) wird. ViewState speichert den alten Wert nicht.

Ich verwende "CreateChildControls", um meine Steuerelemente zum Webpart hinzuzufügen. und das Postback wird von einem einfachen Event-Handler behandelt.

Irgendwelche Ideen?

Für das Protokoll, ich bin MOSS 2007.

+0

Es wäre einfacher zu erkennen, wo das Problem liegt, wenn Sie Code gezeigt haben. –

+0

Richtig, das einzige Problem ist, dass es eine ziemlich große Klasse ist. Aber ich habe es mehr oder weniger so gemacht, wie wir es jetzt brauchen. – noocyte

Antwort

3

Klingt wie ein ASP.NET-Ereignis Timing-Problem verwenden. Versuchen Sie EnsureChildControls() im Ereignis zum Laden der Seite aufzurufen. Dies stellt sicher, dass Ihre CreateChildControls() -Methode aufgerufen wird und Ihre Steuerelemente der Seite hinzugefügt werden, bevor die Post-Back-Ereignisse behandelt werden. Wenn Ihre Steuerelemente zum ersten Mal in der PreRender- oder Render-Phase hinzugefügt werden, ist es zu spät, um die Post-Back-Daten zu übernehmen. Sie werden dann die Änderung nicht vor dem nächsten Laden der Seite sehen.

+0

Alle meine Steuerelemente werden während CreateChildControls() hinzugefügt. Und ich habe versucht, EnsureChildControls() in der OnLoad-Überschreibung aufzurufen, kein Glück. – noocyte

0

Sie können immer ein AJAX-Aktualisierungsfenster verwenden, das darin enthaltene Literalsteuerelement löschen und ein UDP.Update im Aktualisierungsfenster aufrufen. Auch mit Ihrem ersten Beispiel überprüfen Sie runat="server" auf Ihrem literalen Steuerelement. Sie sollten in der Lage sein, dem Ereignis Page_Load eine Änderung hinzuzufügen, die im Webpart angezeigt werden sollte.

+0

Ja, das könnte eine Option gewesen sein, leider ist der fragliche Wert hier dynamisch; dh. die Textbox kann in einem Webpart vorhanden sein oder nicht ...;) – noocyte

+0

Auch; Das Literal wird über den Code hinzugefügt (wie alle Steuerelemente im Webpart). – noocyte

0

Hier ist ein Vorschlag. Es funktioniert sowieso für mich.

using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 

namespace Skaar.UI 
{ 
    public class PostBackWebPart:WebPart 
    { 
     private Literal literal; 
     private TextBox textBox; 
     protected override void OnInit(System.EventArgs e) 
     { 
      base.OnInit(e); 
      literal=new Literal(); 
      literal.Mode = LiteralMode.PassThrough;                                                                                                                                              
      Controls.Add(literal); 
      textBox=new TextBox(); 
      textBox.AutoPostBack = true; 
      Controls.Add(textBox); 
      textBox.TextChanged += textBox_TextChanged;                                                                                  
     } 

     void textBox_TextChanged(object sender, System.EventArgs e) 
     { 
      literal.Text = string.Format("<h1>{0}</h1>", textBox.Text); 
     } 
    } 
}