Советы по созданию динамического элемента управления «Расширенный поиск» в ASP.NET

альтернативный текст http://img3.imageshack.us/img3/1488/advancedsearch.png

Я строю интерфейс «Расширенный поиск» в приложении ASP.NET. Мне не нужно SO, чтобы написать эту вещь для меня, но я застрял на конкретной проблеме, касающейся динамических элементов управления и ViewState. Я хотел бы получить направление, как к этому подойти. Вот моя ситуация:

Ингредиенты:

Обслуживаемый набор объектов API, представляющих сущности, поля и поиски, который обрабатывает построение поиска, генерацию SQL и возврат результатов. Так что обо всем позаботились.ASP.NET 3.5

Желаемая функциональность интерфейса:

(1) При начальной загрузке страницы интерфейс получает предварительно настроенный объект поиска с набором объектов SearchCriterion. Он связывает их в набор элементов управления (см. Изображение выше.)

Некоторые элементы поиска проще, например:

Поле (DropDownList) | Оператор (DropDownList) | Значение (TextBox)

Элементы управления критериями поиска для некоторых типов полей содержат важную информацию, хранящуюся в состоянии просмотра, например:

Поле (DropDownList) | Оператор (DropDownList) | Значение (DropDownList), где выпадающий список «Значение» заполняется запросом базы данных.

Некоторые поля являются поисками других сущностей, что вызывает цепочку селекторов полей, например:

Поле (DropDownList) Поле (DropDownList) | Оператор (DropDownList) | Стоимость

(2) Пользователь изменяет поиск:

Добавление и удаление критериев поиска нажатием соответствующих кнопокНастройка существующих критериев путем изменения поля, оператора или значения. Для изменения поля или оператора потребуется переконфигурировать элемент управления путем изменения доступных операторов, изменения элемента управления вводом «Значение» на другой тип или добавления / удаления DropDownLists из раздела «Поля», если поля типа поиска выбраны / не выбраны ,

(3) Наконец, пользователь нажимает «Поиск», чтобы увидеть свои результаты.

Проблема:

Как вы, вероятно, уже знаете, отвечаете ли вы на этот вопрос, элементы управления, добавленные на страницу динамически, исчезают при обратной передаче. Я создал UserControl, который управляет коллекцией элементов управления и аккуратно выполняет шаг (1) выше, как вы можете видеть на прикрепленном изображении. (Я не беспокоюсь о стиле на данный момент, очевидно.)

Однако в Postback все элементы управления исчезли, а мой объект API поиска исчез. Если бы я мог заставить динамически сгенерированную коллекцию элементов управления просто играть хорошо и придерживаться ViewState, я мог бы изучить элементы управления при обратной передаче, перестроить объект поиска, а затем аккуратно обработать события элемента управления.

Возможные решения

Я мог бы сделать объект поиска сериализуемым и сохранить его в viewstate. Затем при загрузке страницы я мог бы взять ее и восстановить коллекцию элементов управления во время загрузки страницы. Однако я не уверен, будет ли это хорошо работать с элементами управления, генерирующими события, и что произойдет с состоянием представления раскрывающихся списков, которые содержат данные из базы данных - могу ли я получить их обратно? Мне крайне нежелательно повторно запрашивать базу данных при каждой обратной передаче.

Я мог бы разработать собственный серверный элемент управления (см эту ссылку) для такого рода вещей ... но это новая тема для меня и потребует некоторого изучения, плюс я не совсем уверен, будет ли пользовательский серверный элемент управления работать более хорошо с нефиксированными коллекциями элементов управления. Кто-нибудь знает об этом?

Я думал, что смогу сделать это, используя элементы управления с привязкой к данным - например, я мог бы связать свою коллекцию критериев с ретранслятором, у которого есть фиксированная коллекция элементов управления (возможно, скрыть неиспользуемые элементы управления «значение», использовать внутренний ретранслятор для «Поле» раскрывающихся списков). Тогда вся информация останется во ViewState ... верно?

Любые новые идеи будут с благодарностью.

Спасибо за вашу помощь. b.Fandango

Ответы на вопрос(4)

Ваш ответ на вопрос