ASP.Net:Los controles de usuario agregados dinámicamente al marcador de posición no pueden recuperar valores

StackOverflow https://stackoverflow.com/questions/102483

  •  01-07-2019
  •  | 
  •  

Pregunta

Estoy agregando algunos controles de usuario dinámicamente a un control de servidor PlaceHolder.Mi control de usuario consta de algunas etiquetas y algunos controles de cuadro de texto.

Cuando envío el formulario e intento ver el contenido de los cuadros de texto (dentro de cada control de usuario) en el servidor, están vacíos.

Cuando se completa la devolución, los cuadros de texto tienen los datos que ingresé antes de la devolución.Esto me dice que el texto de los cuadros se conserva a través de ViewState.Simplemente no sé por qué no puedo encontrarlos cuando estoy depurando.

¿Alguien puede decirme por qué no veo los datos que el usuario ingresó en el servidor?

Gracias por cualquier ayuda.

¿Fue útil?

Solución

Esto se basa en la secuencia de eventos de .NET v1, pero debería darle una idea:

  • Inicializar (evento de inicio)
  • Comenzar el seguimiento del estado de la vista (comprueba si hay devolución de datos)
    • Cargar estado de vista (si es devolución de datos)
    • Cargar datos de devolución de datos (si se trata de devolución de datos)
  • Cargar (evento de carga)
    • Generar eventos modificados (si hay devolución de datos)
    • Generar eventos de devolución de datos (si hay devolución de datos)
  • PreRender (evento PreRender)
  • Guardar estado de vista
  • Prestar
  • Descargar (evento de descarga)
  • Disponer

Como puede ver, la carga de los datos de ViewState a los controles ocurre antes del evento Load.Entonces, para que los controles agregados dinámicamente "conserven" esos valores, deben ser presente para que la página ASP.NET recargue los valores en primer lugar.Tendría que volver a crear esos controles en la etapa de inicio, antes de que se produzca el estado de vista de carga.

Otros consejos

Ayer descubrí que puedes hacer que tu aplicación funcione normalmente cargando el árbol de control justo después de que se activa el evento loadviewstate.Si anula el evento loadviewstate, llama a mybase.loadviewstate y luego coloca tu propio código para regenerar los controles inmediatamente después, los valores para esos controles estarán disponibles al cargar la página.En una de mis aplicaciones utilizo un campo de estado de vista para contener el ID o la información de la matriz que se puede usar para recrear esos controles.

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

Creo que necesitarás agregar UserControl a PlaceHolder durante la fase de inicio del ciclo de vida de la página, para que la fase de carga complete ViewState para leer esos valores.¿Es este el orden en que los estás cargando?

Asegúrese de definir sus controles dinámicos a nivel de clase y agregarlos al contenedor ASP:

Private dynControl As ASP.MyNamespace_MyControl_ascx

Y cuando cree una instancia del control, asegúrese de llamar a LoadControl para que el objeto se agregue correctamente:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

Tienes que crear tus controles en el controlador de eventos Page_PreInit.El modelo de control del servidor ASP.NET es complicado;tienes que entender completamente el ciclo de vida de la página para hacerlo bien.

Como han dicho otros, cualquier forma de manipulación del control debe realizarse antes de crear el estado de vista.

Aquí hay un buen enlace en el ciclo de vida de la página para ayudarlo:

http://msdn.microsoft.com/en-us/library/ms178472.aspx

Hemos experimentado lo mismo y lo hemos manejado usando controles fantasma en page_load que tienen exactamente el mismo .ID y luego la publicación recoge los eventos y los datos.Como dijeron otros, es la adición dinámica del control después de las etapas iniciales que el estado ya está creado y los controles agregados después no se almacenan.

Espero que esto ayude un poco.

También quiero agregar que he visto que los controles de usuario funcionan de la manera esperada simplemente configurando la propiedad Control.ID en tiempo de ejecución.Si no configura la ID, es posible que los elementos se creen en un orden diferente y funcionen de manera extraña.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top