Как вы сами себе предложили, на самом деле лучший способ - сохранить в кэше результаты поиска автозаполнения и выполнять дальнейшую фильтрацию локально. У меня нет опыта работы с AJAX или Javascript, но я могу привести примеры некоторых простых понятий в C#, которые могут вам в этом помочь.
Для начала, я вижу, в вашем коде у вас есть метод для сделать автозаполнение поиска. Кажется, вы часто используете лямбда-выражения, однако вы можете извлечь из них именованные методы. Я хотел бы, чтобы метод поиска автозаполнения возвращал массив объектов, содержащих результаты сопоставления. Как я уже сказал, незнаком с AXAJ, но в ASP. NET есть кое-что, что вы должны отметить при сохранении локальных временных данных. Один из них - цикл страницы, другой - постоянство переменной. Я предполагаю, что вы знакомы с вашей средой и знаете, как правильно хранить данные, чтобы они правильно сохранялись на протяжении всей жизни страницы. Я бы использовал для этого переменную сеанса.
У вас может быть функция фильтрации, которая будет выглядеть примерно так:
// For the sake of comprehensability, let's assume your result object type is called ACResult, and ACResult.ObjectType is an integer as a type ID.
internal ACResult[] FilterResults(int objType)
{
return cachedResults.Where((result) => { return result.ObjectType == objType; }).ToArray();
}
В примере выше, cachedResults предполагается, что это массив с вами элементы результатов поиска. Он использует метод расширения LINQ Where<T>(Func<T, bool> predicate)
. Здесь есть метод ToArray<T>()
, поскольку метод Where
вернет IEnumerable
, который необходимо преобразовать обратно в массив, чтобы соответствовать типу возвращаемого метода. LINQ или другой эквивалент может быть недоступен. Более простой альтернативой является перебирать их и выбирать те, которые соответствуют желаемому типу:
internal ACResult[] FilterResults(object objType)
{
List<ACResult> ret = new List<ACResult>();
foreach (ACResult result in cachedResults)
{
if (result.ObjectType == objType)
ret.Add(result);
}
return ret.ToArray();
}
Каждая кнопка категории будет вызывать один и тот же обработчик событий с идентификатором типа в качестве параметра, который вызовет этот метод для фильтрации кэшировать результаты и повторно отобразить список предложений автозаполнения с возвращенными результатами. Что-то вроде:
void CategoryButton_OnClicked(int objType)
{
ACResult[] matchingCategory = FilterResults(objType);
if (objType != -1) // Assuming -1 means it's your "All" button.
{
//Pseudo function encapsulating your suggestion list rendering:
ReRenderSuggestionList(matchingCategory);
}
else
{
//Your "All" button clears the cat filtering without reloading the results, which is why the FilterResults method doesn't alter the original "cachedResults" array.
ReRenderSuggestionList(cachedResults);
}
}
Это может не сильно помочь, но я действительно пытаюсь помочь вам здесь. Меня интригует, как что-то, что может быть тривиально в одних средах, может превратиться в настоящую проблему в других, особенно в веб-приложениях, поэтому, вероятно, я держусь от них подальше. Я занимаюсь WinForms, библиотеками классов (. NET (Framework | Core | Standard)) и приложениями UWP.