Die mit Asp.net Ajax 1.0 veröffentlichten Steuerelemente der AjaxControlToolkit-Serie haben Entwicklern viel Komfort gebracht, aber viele davon scheinen nicht so perfekt zu sein, wie wir es uns vorgestellt haben. Ich habe das AutoComplete-Steuerelement in letzter Zeit häufig verwendet und mehrere Mängel oder Fehler festgestellt:
1. In einigen Fällen tritt der Fehler „zwei Komponenten mit derselben ID“ auf.
2. Im IE kann leicht das Problem „Die Internetseite konnte nicht geöffnet werden, ..., der Vorgang wurde abgebrochen“ verursacht werden.
3. Selbst wenn der Benutzer viele Zeichen eingibt und kein übereinstimmendes Ergebnis vorliegt, ruft er dennoch die Servermethode auf, um zu versuchen, den übereinstimmenden Wert zu erhalten, was die Belastung des Servers vergeblich erhöht.
4. Der Stil der automatischen Vervollständigungsliste ist nicht sehr schön.
5. Die Signatur der Servermethode muss sein: string[] GetCompletionList(string prefixText, int count). Andere erforderliche Daten können nicht vom Client abgerufen werden. Dies ist besonders schwerwiegend, wenn auf einer Seite mehrere AutoComplete-Steuerelemente vorhanden sind, die Daten aus verschiedenen Datenquellen abrufen müssen.
Um diese Probleme zu lösen, müssen Sie zunächst wissen, wie Sie den entsprechenden Code ändern und in Ihrer eigenen Anwendung wirksam machen können. Glücklicherweise sind die Steuerelemente der AjaxControlToolkit-Serie Open Source, sodass wir sie entsprechend unseren eigenen Anforderungen ändern können. Öffnen Sie die AjaxControlToolkit-Lösung mit VS2005, öffnen Sie die Datei AutoCompleteBehavior.js im AutoComplete-Ordner, ändern und kompilieren Sie die generierte AjaxControlToolkit.dll-Datei neu und aktualisieren Sie sie auf Ihre eigene Projektreferenz, um unser optimiertes und erweitertes AutoComplete-Steuerelement anzuwenden.
Welcher spezifische Code muss also geändert werden?
Für die erste Frage müssen Sie vor der Zeile AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose'); hinzufügen:
if (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = null;
}
Die zweite Frage besteht darin, die Zeile document.body.appendChild(this._completionListElement); in element.parentNode.appendChild(this._completionListElement); zu ändern.
Die dritte Frage besteht darin, if (text. trim().length < this._minimumPrefixLength) zu verwenden ) Dieses Urteil fügt eine Bedingung hinzu und wird zu: if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) , was bewirkt, dass, wenn die Eingabe des Benutzers 10 Zeichen überschreitet, keine vorhanden ist Sie müssen den Server aufrufen, um den passenden Wert zu lesen.
Die vierte Frage: Um den Stil der automatischen Vervollständigungsliste anzupassen, können Sie den folgenden Code direkt in der Methode initializeCompletionList ändern:
VervollständigungListStyle.backgroundColor = this._textBackground;
VervollständigungListStyle.color = this._textColor;
VervollständigungListStyle.border = 'solid 1px buttonshadow';
VervollständigungListStyle.cursor = 'default';
VervollständigungListStyle.unselectable = 'nicht auswählbar';
VervollständigungListStyle.overflow = 'hidden';
oder löschen Sie diese Zeilen und fügen Sie hinzu: element.className = "completionList" Fügen Sie dann die Definition der Stilklasse "completionList" hinzu,
um das letzte Problem zu lösen
;prefixText: this._currentPrefix, count: this._completionSetCount} Fügen Sie in dieser Zeile einen an den Server gesendeten Parameter hinzu, der zu Folgendem wird:
{ prefixText: this._currentPrefix, count: this._completionSetCount, srcId: this.get_element().getAttribute("srcid") }
Daher kann die serverseitige Methodensignatur zum Lesen von Listenelementen mit automatischer Vervollständigung wie folgt geschrieben werden: string[] GetCompletionList(string prefixText, int count, string srcId). Das bedeutet, dass wir eine Identifikationszeichenfolge voreinstellen können, um die Datenquelle für das Textfeld zu identifizieren, das die Funktion zur automatischen Vervollständigung anwenden muss. Der C#-Code lautet wie folgt: tb.Attributes.Add("srcid", "xxx" ); Dann können in der GetCompletionList-Methode Daten gezielt basierend auf dem vom Client übergebenen Parameterwert gelesen werden.