asp.net mi lista desaparece en la devolución de datos. ¿No puedo encontrar lo que me falta?

Probablemente sea fácil, pero no puedo entenderlo. argh ...

Aplicación C # asp.net con un control de usuario personalizado. Mi control personalizado es una lista simple de imágenes envueltas en un enlace que se utilizará como herramienta de navegación para la página principal.

Cuando hago clic en un enlace, hace una devolución de datos: mi evento de clic no parece activarse, y cuando la página se vuelve a cargar, la lista de imágenes desaparece.

He EnableViewState="true" tanto en la página principal como en el control personalizado. ¿Tengo entendido que esto sería suficiente para conservar mi lista de opciones? Si recargo la lista cada vez y vuelvo a vincular mi controlador de eventos, pensaría que el evento se perdería, ¿correcto?

Aquí está (código abreviado) donde agrego los controles a mi panel.

    public void LoadMediaOptions() {

      loop through a datareader {

        LinkButton b = new LinkButton();
        b.Click += new EventHandler(navOption_Click);
        b.Attributes.Add("mediaID", mediaID.ToString());

        HtmlImage i = new HtmlImage();
        i.Src = strThumbLink;
        i.Width = 120;
        i.Height = 90;
        b.Controls.Add(i);

        _loadedMediaHtml.Add(b);
        panMediaOptions.Controls.Add(b);
     }
  }

Este método actualmente solo se llama una vez en la página principal en el método Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
  try
  {        
    if (!Page.IsPostBack)
      uxMediaNav.LoadMediaOptions();
  }
  catch (Exception ex)
  {
    throw ex;
  }
}

Después de la publicación de la página, no hay opciones de medios cargadas para mí. Mi comprensión del EnableViewState es que conservaría los elementos que he cargado dinámicamente, pero este no es el caso.

preguntado el 27 de agosto de 11 a las 20:08

por favor publique su código ... realmente nos ayudará a diagnosticar. -

hecho. Como broma, en realidad, simplemente tomé el método LoadMediaOptions () fuera del condicional, y mi código funciona como se esperaba, con las opciones de medios cargándose correctamente, pero lo que es más importante, también lo hace el controlador de eventos, que no entiendo totalmente. Si las opciones de medios se borran y luego tienen que cargarse manualmente cada vez, incluida la re-vinculación del controlador de eventos, ¿cómo averigua el servidor cómo llamar al evento? -

2 Respuestas

Está construyendo sus controles demasiado tarde en el ciclo de vida de la página. ViewState se carga después de init y antes de Load. Ver aquí para el ciclo de vida de la página.

Esto significa que su control personalizado no puede conservar ningún estado, ya que los controles aún no existen cuando se produce el estado de carga. Mueva su construcción de control a PreInit y debería funcionar.

Los eventos de control se activan después de Load pero antes de onLoadComplete. En realidad, el evento se pasa en la solicitud y se compara con un control basado en el ID. Siempre que se pueda encontrar el control en el momento en que se activen los eventos de control, el evento se activará. Por lo tanto, los eventos generalmente no dependen de ViewState, con la excepción de los eventos de cambio. Los eventos de cambio lo hacen porque ASP.NET necesita poder comparar el valor original persistente en ViewState con el valor de la solicitud actual para saber si se activa el evento.

Para asegurarse de que se active cualquier evento de cambio, debe asegurarse de que los controles dentro de su control personalizado se creen en PreInit.

Respondido 28 ago 11, 01:08

Esto tiene mucho sentido y explica el comportamiento extraño que veo. Revisaré el artículo que enviaste, ¡gracias! - gdbj

En mi página principal, dentro del controlador de eventos PreInit, mi control de usuario personalizado aún no se ha creado para realizar ningún procesamiento. Solo existe dentro del controlador de eventos Init. - gdbj

Este problema parece extenderse a las variables privadas que también quiero que persistan. Todos se restablecen a valores nulos o predeterminados durante la devolución de datos. Pero solo para un control personalizado. Tengo otros controles normales en la página que funcionan como se esperaba. - gdbj

Parece que respondí mi propia pregunta. No me di cuenta de que teníamos que agregar / eliminar valores a ViewState manualmente. De alguna manera, pensé que el código ASP.Net persistía mágicamente con los valores que se requerían. Por lo tanto, no es una cuestión de tiempo, sino que nunca almacené nada en ViewState para que se guarde en PostBack. Misterio resuelto. Gracias por señalarme en la dirección del ciclo de vida de la página ... me hizo leer sobre ViewState y cómo funciona realmente. - gdbj

Cuando hablaba de eventos, me refería a los eventos en su control personalizado (no a la página). Agregar controles a su control personalizado en Init está bien, no puedo recordar si los controles tienen un PreInit (sospecho que no). Los controles ASP.NET tienen codemagic para ViewState, pero sí, si desea conservar las propiedades en su control personalizado, debe agregarlas a ViewState usted mismo. Me alegro de que lo hayas hecho funcionar. - TheCodeKing

La solución es simple: coloque changeControl en el método Page_Load.

protected void Page_Load(object sender, EventArgs e)
    {
        changeControl((UserControl)LoadControl("~/user-control.ascx"));
    }

Respondido 03 Abr '13, 12:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.