Conselhos para criar um controle dinâmico de “Pesquisa avançada” no ASP.NET

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

Estou construindo uma interface "Advanced Search" em um aplicativo ASP.NET. Eu não preciso SO para escrever isso para mim, mas estou preso em um problema específico sobre controles dinâmicos e ViewState. Eu gostaria de algumas orientações sobre como abordar isso. Aqui está minha situação:

Ingredientes:

Um conjunto de objetos de API que permite manutenção representando entidades, campos e pesquisas, que manipula a construção de uma pesquisa, gerando SQL e retornando os resultados. Então, tudo isso é cuidado.ASP.NET 3.5

Funcionalidade de interface desejada:

(1) No carregamento inicial da página, a interface obtém um objeto Search pré-configurado com um conjunto de objetos SearchCriterion. Ele os liga em um conjunto de controles (veja a imagem acima).

Alguns itens de pesquisa são mais simples, como:

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

Os controles de Critérios de Pesquisa para alguns tipos de campo possuem informações importantes armazenadas no viewstate, como:

Campo (DropDownList) | Operador (DropDownList) | Valor (DropDownList) em que a lista suspensa "Valor" é preenchida por uma consulta de banco de dados.

Alguns campos são pesquisas para outras Entidades, o que causa uma cadeia de seletores de campo, como:

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

(2) O usuário modifica a pesquisa por:

Adicionando e removendo os critérios de pesquisa clicando nos respectivos botõesConfigurando critérios existentes alterando o campo, o operador ou o valor. Alterações no campo ou no operador exigirão que o controle se reconfigure alterando os operadores disponíveis, alterando o controle de entrada "Valor" para um tipo diferente ou adicionando / removendo DropDownLists da seção "Campos" se os campos do tipo Pesquisa estiverem selecionados / não selecionados .

(3) Finalmente, o usuário acessa "Search" para ver seus resultados.

O problema:

Como você provavelmente já sabe se está respondendo a essa pergunta, os controles adicionados dinamicamente à página desaparecem no postback. Eu criei um UserControl que manipula a coleção de controle e realiza perfeitamente o passo (1) acima, como você pode ver na imagem anexada. (Eu não estou preocupado com estilo neste momento, obviamente.)

No entanto, no Postback, os controles foram todos embora e meu objeto Search API desapareceu. Se eu conseguisse fazer com que a coleção de controle gerada dinamicamente apenas funcionasse bem e ficasse no ViewState, eu poderia examinar os controles no postback, reconstruir o objeto Search e manipular os eventos de controle de maneira organizada.

Soluções possíveis

Eu poderia tornar o objeto de pesquisa serializável e armazená-lo no viewstate. Então, no carregamento da página, eu poderia pegá-lo e reconstruir a coleção de controle no tempo de carregamento da página. No entanto, não tenho certeza se isso funcionaria muito bem com os controles que geram eventos, e o que acontece com o estado de visualização das listas suspensas que contêm dados do banco de dados - posso recuperá-lo? É altamente indesejável para mim ter que consultar novamente o banco de dados em cada postback.

Eu poderia desenvolver um controle de servidor personalizado (veja este link) para esse tipo de coisa ... mas esse é um tópico novo para mim e envolveria algum aprendizado, além de não ter certeza se um controle de servidor personalizado funcionaria mais bem com coleções de controle não fixas. Alguém sabe disso?

Eu estava pensando que eu poderia ser capaz de fazer isso usando databound controles - por exemplo, eu poderia vincular minha coleção de critério a um repetidor que tem uma coleção de controle fixo (talvez ocultar os controles de "valor" não usados, use um repetidor interno para o Listas suspensas "Campo"). Então todas as informações ficariam no ViewState ... certo?

Qualquer ideia nova seria muito apreciada.

Obrigado pela ajuda. b.Fandango

questionAnswers(4)

yourAnswerToTheQuestion