Элементы управления серии AjaxControlToolkit, выпущенные вместе с Asp.net Ajax 1.0, принесли разработчикам большое удобство, но многие из них кажутся не такими совершенными, как мы себе представляли. В последнее время я часто использую элемент управления AutoComplete и обнаружил несколько недостатков или ошибок:
1. В некоторых случаях возникает ошибка "два компонента с одинаковым идентификатором";
2. В IE легко вызвать проблему «Невозможно открыть интернет-сайт..., операция прервана»;
3. Даже если пользователь вводит много символов, даже если нет совпадающего результата, он все равно будет вызывать метод сервера, чтобы попытаться получить совпадающее значение, что напрасно увеличивает нагрузку на сервер;
4. Не очень приятный стиль списка автозаполнения;
5. Сигнатура серверного метода должна быть следующей: string[] GetCompletionList(string prefixText, int count). Другие необходимые данные невозможно получить от клиента. Это особенно опасно, когда на странице имеется несколько элементов управления автозаполнением, которым необходимо получать данные из разных источников данных.
Чтобы решить эти проблемы, сначала нужно знать, как модифицировать соответствующий код и сделать его эффективным в собственном приложении. К счастью, элементы управления серии AjaxControlToolkit имеют открытый исходный код, поэтому мы можем модифицировать их в соответствии с нашими потребностями. Откройте решение AjaxControlToolkit с помощью VS2005, откройте файл AutoCompleteBehavior.js в папке AutoComplete, измените и перекомпилируйте, а также обновите сгенерированный файл AjaxControlToolkit.dll в соответствии со ссылкой на собственный проект, чтобы применить наш оптимизированный и расширенный элемент управления AutoComplete.
Итак, какой конкретно код необходимо изменить?
Для первого вопроса вам нужно добавить перед строкой AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');:
если (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = null;
}
Второй вопрос — изменить строку document.body.appendChild(this._completionListElement); на element.parentNode.appendChild(this._completionListElement);
Третий вопрос — использовать if (text. trip().length < this._minimumPrefixLength); ) Это решение добавляет условие и становится следующим: if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) , что делает, когда, когда ввод пользователя превышает 10 символов, нет необходимо вызвать сервер, чтобы прочитать соответствующее значение.
Четвертый вопрос: чтобы настроить стиль списка автозаполнения, вы можете напрямую изменить следующий код в методе InitializeCompletionList:
завершениеListStyle.backgroundColor = this._textBackground;
завершениеListStyle.color = this._textColor;
завершениеListStyle.border = 'сплошная тень кнопки толщиной 1 пиксель';
завершениеListStyle.cursor = 'по умолчанию';
завершениеListStyle.unselectable = 'невыбираемый';
завершениеListStyle.overflow = 'hidden';
или удалите эти строки и добавьте: element.className = "completionList"; Затем добавьте определение класса стиля "completionList" на страницу,
чтобы решить последнюю проблему, оно должно быть в {; prefixText: this._currentPrefix, count: this._completionSetCount} Добавьте в эту строку параметр, отправляемый на сервер, который станет:
{ prefixText: this._currentPrefix, count: this._completionSetCount, srcId: this.get_element().getAttribute("srcid") }
Таким образом, сигнатуру серверного метода для чтения элементов списка автозаполнения можно записать как: string[] GetCompletionList(string prefixText, int count, string srcId). Это означает, что мы можем предварительно установить идентификационную строку, чтобы идентифицировать источник данных для текстового поля, к которому необходимо применить функцию автозаполнения. Код C# такой: tb.Attributes.Add("srcid", "xxx" ); Затем в методе GetCompletionList данные могут быть прочитаны целевым образом на основе значения параметра, переданного клиентом.