Consejos para crear un control dinámico de "Búsqueda avanzada" en ASP.NET

texto alternativo http://img3.imageshack.us/img3/1488/advancedsearch.png

Estoy creando una interfaz de "Búsqueda avanzada" en una aplicación ASP.NET. No necesito SO para escribir esto para mí, pero estoy atascado en un problema específico relacionado con los controles dinámicos y ViewState. Me gustaría alguna dirección sobre cómo abordar esto. Aquí está mi situación:

Ingredientes:

Un conjunto útil de objetos API que representan entidades, campos y búsquedas, que se encarga de construir una búsqueda, generar SQL y devolver los resultados. Así que eso es todo cuidado.ASP.NET 3.5

Funcionalidad de interfaz deseada:

(1) En la carga de la página inicial, la interfaz obtiene un objeto de búsqueda preconfigurado con un conjunto de objetos SearchCriterion. Los une en un conjunto de controles (ver imagen arriba).

Algunos elementos de búsqueda son más simples, como:

Campo (DropDownList) | Operador (DropDownList) | Valor (TextBox)

Los controles de criterio de búsqueda para algunos tipos de campos tienen información importante almacenada en el estado de visualización, como:

Campo (DropDownList) | Operador (DropDownList) | Valor (DropDownList) donde la lista desplegable "Valor" se rellena con una consulta de base de datos.

Algunos campos son búsquedas de otras Entidades, lo que provoca una cadena de selectores de campo, como:

Campo (DropDownList) Campo (DropDownList) | Operador (DropDownList) | Valor

(2) El usuario modifica la búsqueda por:

Agregar y eliminar criterios de búsqueda haciendo clic en los botones respectivosConfiguración de los criterios existentes cambiando el campo, el operador o el valor. Los cambios en Campo u Operador requerirán que el control se reconfigure a sí mismo cambiando los operadores disponibles, cambiando el control de entrada "Valor" a un tipo diferente, o agregando / eliminando DropDownLists de la sección "Campos" si los campos de tipo de búsqueda están seleccionados / no seleccionados .

(3) Finalmente, el usuario pulsa "Buscar" para ver sus resultados.

El problema:

Como probablemente ya sepa si está respondiendo a esta pregunta, los controles agregados dinámicamente a la página desaparecen en la devolución de datos. He creado un UserControl que manipula la colección de control y cumple perfectamente el paso (1) anterior como se puede ver en la imagen adjunta. (No me preocupa el estilo en este punto, obviamente).

Sin embargo, en la devolución, todos los controles se han ido y mi objeto de la API de búsqueda se ha ido. Si pudiera obtener la colección de control generada dinámicamente para jugar bien y quedarse en ViewState, podría examinar los controles en la devolución de datos, reconstruir el objeto de búsqueda y luego manejar los eventos de control de forma ordenada.

Soluciones posibles

Podría hacer que el objeto de búsqueda sea serializable y almacenarlo en viewstate. Luego, en la carga de la página, podría agarrarlo y reconstruir la colección de control en el tiempo de carga de la página. Sin embargo, no estoy seguro de si esto funcionaría bien con los controles que generan eventos, y qué sucede con el estado de visualización de las listas desplegables que contienen datos de la base de datos. ¿Puedo recuperarlo? Es altamente indeseable para mí tener que volver a consultar la base de datos en cada devolución de datos.

Podría desarrollar un control de servidor personalizado (ver este enlace) para este tipo de cosas ... pero ese es un tema nuevo para mí e involucraría algo de aprendizaje, además, no estoy totalmente seguro de que un control de servidor personalizado funcione mejor con colecciones de control no fijas. Alguien sabe sobre eso?

Estaba pensando que podría lograr esto utilizando controles de base de datos; por ejemplo, podría vincular mi colección de criterios a un repetidor que tiene una colección de control fija (tal vez ocultar los controles de "valor" no utilizados, usar un repetidor interno para el "Campo" listas desplegables). Entonces toda la información se quedaría en ViewState ... ¿verdad?

Cualquier nueva idea sería muy apreciada.

gracias por tu ayuda. b.Fandango