Asp.net Ajax 1.0 とともにリリースされた AjaxControlToolkit シリーズ コントロールは、開発者に多くの利便性をもたらしましたが、その多くは私たちが想像していたほど完璧ではないようです。最近オートコンプリート コントロールを頻繁に使用しているのですが、いくつかの欠点やエラーを発見しました。
1. 場合によっては、「同じ ID を持つ 2 つのコンポーネント」というエラーが発生します。
2. IEで「インターネットサイトを開けません…操作が終了しました」という問題が発生しやすい。
3. ユーザーが大量の文字を入力した場合、一致する結果がない場合でも、サーバーのメソッドを呼び出して一致する値を取得しようとするため、サーバーの負荷が無駄に増加します。
4. オートコンプリートリストのスタイルはあまり良くありません。
5. サーバー メソッドのシグネチャは、string[] GetCompletionList(string prefixText, int count) である必要があります。その他の必要なデータはクライアントから取得できません。これは、異なるデータ ソースからデータを取得する必要があるページ内に複数の AutoComplete コントロールがある場合に特に致命的です。
これらの問題を解決するには、まず、対応するコードを変更して、それを独自のアプリケーションで有効にする方法を知る必要があります。幸いなことに、AjaxControlToolkit シリーズのコントロールはオープンソースであるため、独自のニーズに応じて変更できます。 VS2005 で AjaxControlToolkit ソリューションを開き、AutoComplete フォルダー内の AutoCompleteBehavior.js ファイルを開き、変更して再コンパイルし、生成された AjaxControlToolkit.dll ファイルを独自のプロジェクト参照に更新して、最適化および強化された AutoComplete コントロールを適用します。
では、具体的にどのコードを変更する必要があるのでしょうか?
最初の質問では、行 AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose'); の前に追加する必要があります。
if (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = null;
}
2 番目の質問は、行 document.body.appendChild(this._completionListElement); を element.parentNode.appendChild(this._completionListElement); に変更することです。3
番目の質問は、if (text.trim().length < this._minimumPrefixLength) を使用することです。 ) この判断には条件が追加され、 if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) となり、ユーザーの入力が 10 文字を超えると、一致する値を読み取るためにサーバーを呼び出す必要があります。
4 番目の質問は、オートコンプリート リストのスタイルを調整するために、initializeCompletionList メソッドで次のコードを直接変更できます。
completedListStyle.backgroundColor = this._textBackground;
completedListStyle.color = this._textColor;
completedListStyle.border = 'solid 1px buttonshadow';
completedListStyle.cursor = 'デフォルト';
completedListStyle.unselectable = '選択不可';
completeListStyle.overflow = 'hidden';
次のように
追加します。
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 メソッドで、クライアントから渡されたパラメーター値に基づいて、データを目的の方法で読み取ることができます。