Asp.net Ajax 1.0과 함께 출시된 AjaxControlToolkit 시리즈 컨트롤은 개발자에게 많은 편의성을 제공했지만 그 중 상당수는 우리가 상상했던 것만큼 완벽하지는 않은 것 같습니다. 최근에 AutoComplete 컨트롤을 많이 사용해 왔는데 몇 가지 단점이나 오류가 발견되었습니다.
1. 어떤 경우에는 "동일한 ID를 가진 두 개의 구성 요소" 오류가 발생합니다.
2. IE에서는 "인터넷 사이트를 열 수 없습니다..., 작업이 종료되었습니다"라는 문제가 발생하기 쉽습니다.
3. 사용자가 많은 문자를 입력하더라도 일치하는 결과가 없더라도 여전히 서버 메소드를 호출하여 일치하는 값을 얻으려고 시도하므로 서버의 부담이 헛되이 증가합니다.
4. 자동 완성 목록의 스타일은 그다지 좋지 않습니다.
5. 서버 메소드의 서명은 다음과 같아야 합니다. string[] GetCompletionList(string prefixText, int count). 기타 필수 데이터는 클라이언트에서 얻을 수 없습니다. 페이지에 여러 데이터 원본에서 데이터를 가져와야 하는 AutoComplete 컨트롤이 여러 개 있는 경우 이는 특히 치명적입니다.
이러한 문제를 해결하려면 먼저 해당 코드를 수정하고 자신의 애플리케이션에 효과적으로 적용하는 방법을 알아야 합니다. 다행히 AjaxControlToolkit 시리즈 컨트롤은 오픈 소스이므로 필요에 따라 수정할 수 있습니다. VS2005로 AjaxControlToolkit 솔루션을 열고, AutoComplete 폴더에서 AutoCompleteBehavior.js 파일을 열고, 생성된 AjaxControlToolkit.dll 파일을 수정 및 재컴파일하고, 생성된 AjaxControlToolkit.dll 파일을 자신의 프로젝트 참조로 업데이트하여 최적화되고 향상된 AutoComplete 컨트롤을 적용합니다.
그렇다면 구체적으로 어떤 코드를 수정해야 합니까?
첫 번째 질문의 경우 AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose'); 행 앞에 추가해야 합니다.
if (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = null;
}
두 번째 질문은 document.body.appendChild(this._completionListElement); 줄을 element.parentNode.appendChild(this._completionListElement);로 변경하는 것입니다.
세 번째 질문은 if (text.trim().length < this._minimumPrefixLength)를 사용하는 것입니다. ) 이 판단은 조건을 추가하여 다음과 같이 됩니다: if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) 이는 사용자의 입력이 10자를 초과할 때, 일치하는 값을 읽으려면 서버를 호출해야 합니다.
네 번째 질문은 자동 완성 목록의 스타일을 조정하기 위해 초기화CompletionList 메서드에서 다음 코드를 직접 수정할 수 있습니다.
완성목록스타일.배경색상 = this._textBackground;
CompletionListStyle.color = this._textColor;
CompletionListStyle.border = '단단한 1px 버튼 섀도우';
CompletionListStyle.cursor = '기본값';
CompletionListStyle.unselectable = '선택할 수 없음';
CompletionListStyle.overflow = 'hidden';
또는 다음 줄을 삭제하고 다음을 추가합니다. element.className = "completionList"; 그런 다음 페이지에 스타일 클래스 "completionList" 정의를 추가하면
{ prefixText: this._currentPrefix, count: this._completionSetCount} 이 줄에 서버로 전송되는 매개변수를 추가합니다.
{ prefixText: this._currentPrefix, 개수: this._completionSetCount, srcId: this.get_element().getAttribute("srcid") }
따라서 자동 완성 목록 항목을 읽기 위한 서버측 메서드 시그니처는 string[] GetCompletionList(string prefixText, int count, string srcId)로 작성할 수 있습니다. 이는 자동 완성 기능을 적용해야 하는 텍스트 상자의 데이터 소스를 식별하기 위해 식별 문자열을 미리 설정할 수 있음을 의미합니다. C# 코드는 다음과 같습니다. tb.Attributes.Add("srcid", "xxx" ); 그런 다음 GetCompletionList 메서드에서는 클라이언트가 전달한 매개 변수 값을 기반으로 타겟 방식으로 데이터를 읽을 수 있습니다.