Cambie dinámicamente el control de usuario en ASP.Net

Intento crear una página web que muestre un control de usuario adecuado en función del valor seleccionado de una lista desplegable.

Básicamente, el diseño de página es este:

Selección desplegable
< Control de usuario creado en función de la selección desplegable >

Lo tengo medio trabajando … los controles están cambiando cuando cambia la selección. En OnInit (), creo dinámicamente el último control seleccionado (cuyo valor se guarda en el estado de la sesión porque ViewState no está disponible en OnInit).

Cuando se produce el cambio de selección desplegable, elimino el antiguo control de usuario y agrego uno nuevo. El problema es que con el nuevo control que se agrega desde el evento de cambio de selección, no puedo guardar los cambios del usuario en la primera devolución de datos . Después de la primera publicación posterior, el control seleccionado se crea desde OnInit en lugar del evento Change, y el estado se guarda a partir de ese momento, hasta que cambie la siguiente selección.

Aquí está el método SelectionChanged:

protected void SelectionChanged(object sender, EventArgs e) { SelectedValue = int.Parse(DropDownList.SelectedValue); //Store in Session Control userControl = GetSpecificUserControl(SelectedValue); PlaceHolder1.Controls.Clear(); // Remove old user control PlaceHolder1.Controls.Add(userControl); } 

Cualquier cambio realizado en el nuevo control por parte del usuario después de que ocurra SelectionChanged no se guarda en la siguiente publicación. Sin embargo, las devoluciones posteriores se guardan. En ese punto, el control se está creando en OnInit ().

¿Hay alguna forma de forzar la devolución correcta de la publicación y ViewState cuando cambia el control? ¿Es posible forzar una reinicialización de página después de cambiar el control?

Este es el clásico problema de lagrimeo con formas web ASP.Net. Tienes varias opciones:

1) Esto es un poco complicado, ya que va un poco fuera del ciclo de vida de la página prevista, pero en mi experiencia es la manera más directa de lidiar con el problema. Cuando la página publique desde el evento de selección desplegable, simplemente Request["MyDropDownID"] sondeo Request["MyDropDownID"] para el valor seleccionado del control desplegable durante Init() – no espere que el evento OnMyDropDownChanged() configure su página.

2) Implemente su propio manejo de ViewState para sus controles de usuario. Esto requiere profundizar en la documentación de ViewState y anular una cantidad de métodos.

3) La solución de Joel. Él me ganó, pero yo estaba tratando de obtener la primera publicación: p

Otras opciones implican publicar valores usando javascript y demás, pero se vuelven realmente complicados.

Lo que debe hacer es mantener el último valor conocido de DropDownList en la sesión. Entonces:

OnInit:

  • Cree el control que indique el valor guardado en la sesión

Evento SelectionChanged

  • Elimine lo que haya creado durante OnInit
  • Crear y agregar un nuevo control basado en la nueva selección DropDownList
  • Guardar nueva selección DropDownList en sesión

De esta forma, en la próxima devolución de datos después de un cambio, está recreando el control que ViewState esperaba encontrar, y por lo tanto su estado se restaurará.

Los controles dynamics pueden ser muy quisquillosos. A menudo es más fácil crear todos los controles que posiblemente necesite y establecer sus propiedades visibles en falso. De esta forma, no se representan en absoluto al navegador. Luego configure Visible en verdadero solo para los controles que necesita cuando los necesita.

Si la lista de opciones no es demasiado grande, puede renderizar todos los controles de usuario estáticamente y usar JavaScript / jQuery para mostrar / ocultar los controles apropiados en función del valor del menú desplegable (evento js de cambio). Puede usar el valor desplegable para extraer los valores apropiados de los controles del usuario al guardar.

Evita el dolor de lidiar con controles dynamics, proporciona una interfaz de usuario más receptiva al seleccionar del menú desplegable (sin devolución de datos), etc.

No agregue el control en el controlador SelectedIndexChanged, agréguelo durante Page_Load. Simplemente deberá probar el valor del menú desplegable cada vez que se cargue la página y cargar el control correcto para ese valor.