Поскольку в течение 2 часов никто больше не наносил удар, я скину свою шляпу в кольцо с решением, которое вообще не зависит от viewstate (или модели обратных передач ASP.NET).
Что если вы захватили все входные значения с помощью jQuery и вместо постбэка сделали пост на странице (или на новой странице results.aspx)? Или вы можете сделать все это асинхронным и выполнить Ajax-запрос к веб-методу, получить результаты и заполнить его на стороне клиента по мере необходимости?
Прискорбно, что вы должны восстановить, какой тип элементов управления использовался для построения поискового запроса, так как эти данные не будут передаваться с состоянием просмотра. Но я предполагаю, что вам все равно придется выполнить какой-то перевод ваших входных данных в форму запроса.
Прочтите здесь для получения дополнительной информации об использовании jQuery для обращения к методу страницы ASP.NET. Помните - методы страницы должны быть статическими (это просто упустить).
Я не уверен, что вы делаете на стороне сервера для создания вашего запроса - но я бы настоятельно рекомендовал LINQ. Ранее я выполнял аналогичную функцию «расширенного поиска», и после нескольких разных попыток обнаружил, что LINQ был прекрасным инструментом для решения этой проблемы, независимо от того, выполнял ли я запуск SQL с помощью LINQtoSQL или просто набор объектов в памяти.
Это сработало очень хорошо, потому что 1) LINQ - это отложенное выполнение и 2) запрос LINQ возвращает другой запрашиваемый объект. Здесь подразумевается, что вы можете объединять ваши запросы LINQ вместе, когда вы создаете их из своего ввода, вместо того, чтобы выполнять перевод одного массивного предложения в SQL или любой другой используемый вами бэкстор (одна из моих попыток заключалась в создании предложений SQL со строками, но все еще передавая входные данные через SQLParameters для защиты SQL-инъекций - это было грязно и сложно, когда созданный вручную LINQ был на порядок проще для понимания и реализации).
Например:
List<string> data; // or perhaps your a DB Context for LINQtoSQL?
var query = data.Where(item => item.contains("foo"));
if( {user supplies length search option} )
query = query.Where(item => item.Length < 5);
// etc, etc.
// LINQ doesn't do anything until the query is iterated, at which point
// it will construct the SQL statement without you worrying about details or parameter binding
foreach(string value in query)
; // do something with the results
Из-за отложенного выполнения и запрашиваемого возвращаемого типа вы можете объединять запросы LINQ к этому выражению в течение всего дня и позволить ему беспокоиться о деталях реализации (таких как преобразование в запрос SQL) во время выполнения.