ASP.Net: los controles de usuario agregados al marcador de posición dinámicamente no pueden recuperar valores
postback user-controls (8)
Asegúrese de definir los controles dinámicos en el nivel de clase y agregarlos al contenedor ASP:
Private dynControl As ASP.MyNamespace_MyControl_ascx
Y cuando crea 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)
Estoy agregando algunos controles de usuario dinámicamente a un control de servidor PlaceHolder. Mi control de usuario consiste en algunas etiquetas y algunos controles de cuadro de texto.
Cuando envío el formulario y trato de ver el contenido de los cuadros de texto (dentro de cada control de usuario) en el servidor, están vacíos.
Cuando finaliza la devolución de datos, los cuadros de texto tienen los datos que ingresé antes de la devolución. Esto me dice que el texto en los cuadros se conserva a través de ViewState. Simplemente no sé por qué no puedo encontrarlos cuando estoy depurando.
¿Puede alguien decirme por qué no vería los datos que el usuario ingresó en el servidor?
Gracias por cualquier ayuda.
Como han dicho otros, cualquier forma de manipulación de control debe realizarse antes de que se cree viewstate.
Aquí hay un buen enlace en el ciclo de vida de la página para ayudarlo:
Creo que deberá agregar el UserControl al PlaceHolder durante la fase Init del ciclo de vida de la página, para que la fase Load cargue el ViewState y lea esos valores. ¿Es este el orden en el que los estás cargando?
Esto se basa en la secuencia de eventos .NET v1, pero debería darle la idea:
- Inicializar (evento Init)
- Comience el estado de la vista de seguimiento (comprueba si la devolución de datos)
- Cargar estado de vista (si es postback)
- Cargar datos de devolución de datos (si la devolución de datos)
- Cargar (evento de carga)
- Subir eventos modificados (si es postback)
- Subir eventos de postback (si es postback)
- PreRender (evento PreRender)
- Guardar estado de vista
- Hacer
- Descargar (evento de descarga)
- Disponer
Como puede ver, la carga de los datos de ViewState a los controles suceden antes del evento Load. Por lo tanto, para que los controles agregados dinámicamente "retengan" esos valores, deben estar presentes para que la página ASP.NET vuelva a cargar los valores desde el principio. Debería volver a crear esos controles en la etapa Init, antes de que se produzca Load View State.
Hemos experimentado lo mismo y lo hemos manejado mediante el uso de controles fantasma en page_load que tienen exactamente el mismo .ID y luego la publicación recoge los eventos y los datos. Como otros dijeron, es la adición dinámica del control después de las etapas de inicio que el estado ya está construido 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 forma en que esperaría que solo configurando la propiedad Control.ID en tiempo de ejecución. Si no configura la ID, los elementos pueden construirse en un orden diferente y funcionar de manera extraña.
Ayer descubrí que puedes hacer que tu aplicación funcione como siempre cargando el árbol de control justo después de que se active el evento loadviewstatevent. Si anula el evento loadviewstate, llame a mybase.loadviewstate y luego coloque su propio código para regenerar los controles inmediatamente después, los valores para esos controles estarán disponibles en la carga de la página. En una de mis aplicaciones utilizo un campo viewstate para contener la 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