2009-02-17 14 views
6

Quello che sto cercando di fare è creare una webpart che abbia una casella di testo in cui è possibile impostare il valore di un letterale (h2) sulla webpart e un pulsante "salva" che post indietro e quindi imposta il letterale di conseguenza. Questo funziona con un enorme avvertimento; quando la pagina viene caricata dopo il postback, il letterale non è stato modificato. Tuttavia se registro ciò che è effettivamente impostato nel letterale ha il nuovo valore. Inoltre, se ricarico nuovamente la pagina (F5), viene visualizzata correttamente.Implementare correttamente una web part con postback?

Inizialmente ho pensato che fosse ViewState, quindi l'ho disabilitato per tutti i controlli. Ho verificato che non è stato salvato nel ViewState (decodificato). Quindi ViewState non sta salvando il vecchio valore.

Sto usando "CreateChildControls" per aggiungere i miei controlli alla webpart. e il postback è gestito da un semplice gestore di eventi.

Qualche idea?

Per la cronaca, sto usando MOSS 2007.

+0

Sarebbe più facile individuare il problema se è stato mostrato del codice. –

+0

Vero, solo il problema è che è una classe piuttosto grande .. Ma ho fatto funzionare più o meno il modo in cui ne abbiamo bisogno per ora. – noocyte

risposta

3

suona come un cronometraggio evento problema ASP.NET. Prova a chiamare ConfirmChildControls() nell'evento di caricamento della pagina. Ciò assicura che il metodo CreateChildControls() venga chiamato e i controlli vengano aggiunti alla pagina prima che vengano gestiti gli eventi postback. Se i tuoi controlli vengono aggiunti per la prima volta nella fase PreRender o Render, sarà troppo tardi per loro per raccogliere i dati postback. Non vedrai la modifica prima del caricamento della pagina successiva.

+0

Tutti i miei controlli vengono aggiunti durante CreateChildControls(). E ho provato a chiamare ConfirmChildControls() nell'override di OnLoad, senza fortuna. – noocyte

0

È sempre possibile utilizzare un pannello di aggiornamento AJAX, rilasciare il controllo letterale al suo interno e chiamare un UDP.Update sul pannello di aggiornamento. Inoltre con il tuo esempio di esempio iniziale hai runat="server" sul tuo controllo letterale. Dovresti essere in grado di aggiungere una modifica all'evento Page_Load e questo dovrebbe apparire sulla webpart.

+0

Sì, quella poteva essere un'opzione, sfortunatamente il valore in questione qui è dinamico; vale a dire. la casella di testo può o non può essere presente in una web part ...;) – noocyte

+0

Inoltre; il letterale viene aggiunto tramite codice (come tutti i controlli nella webpart). – noocyte

0

Ecco un suggerimento. Funziona comunque per me.

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); 
     } 
    } 
} 
Problemi correlati