2009-02-17 13 views
6

Lo que intento hacer es crear un elemento web que tenga un cuadro de texto donde pueda establecer el valor de un literal (h2) en la parte web y un botón "guardar" que publique y luego establezca el literal correspondiente. Esto funciona con una gran advertencia; cuando la página se carga después de la devolución, el literal no se ha modificado. Sin embargo, si registro lo que realmente está configurado en el literal, tiene el nuevo valor. Además, si vuelvo a cargar la página (F5), se muestra correctamente.¿Implementar correctamente un webpart con devolución de datos?

Al principio pensé que debía ser ViewState, así que lo deshabilité para todos los controles. Verifiqué que no se está guardando en ViewState (lo decodificó). Entonces ViewState no está guardando el valor anterior.

Estoy usando "CreateChildControls" para agregar mis controles al webpart. y la devolución de datos es manejada por un controlador de eventos simple.

¿Alguna idea?

Para que conste, estoy usando MOSS 2007.

+0

Sería más fácil detectar dónde está el problema si mostrara algún código. –

+0

Es cierto, el único problema es que es una clase bastante grande ... Pero lo he hecho funcionar más o menos de la manera que lo necesitamos ahora. – noocyte

Respuesta

3

Suena como un evento de sincronización problema ASP.NET. Intente llamar a EnsureChildControls() en el evento de carga de página. Esto garantiza que se llame a su método CreateChildControls() y que sus controles se agreguen a la página antes de que se manejen los eventos posteriores a la publicación. Si los controles se agregan por primera vez en la etapa PreRender o Render, será demasiado tarde para que recojan los datos de la publicación posterior. Entonces no verá el cambio antes de la carga de la página siguiente.

+0

Todos mis controles se agregan durante CreateChildControls(). Y traté de llamar a EnsureChildControls() en la anulación de OnLoad, sin suerte. – noocyte

0

Siempre puede usar un panel de actualización AJAX, soltar su control literal y llamar a UDP.Update en el panel de actualización. También con su ejemplo inicial, compruebe que tiene runat="server" en su control literal. Debería poder agregar un cambio al evento Page_Load y esto debería aparecer en la parte web.

+0

Sí, esa podría haber sido una opción, lamentablemente el valor en cuestión aquí es dinámico; es decir. el cuadro de texto puede o no estar presente en un webpart ...;) – noocyte

+0

También; el literal se agrega a través del código (como todos los controles en la parte web). – noocyte

0

Aquí hay una sugerencia. Funciona para mí de todos modos.

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); 
     } 
    } 
} 
Cuestiones relacionadas