Les contrôles de la série AjaxControlToolkit publiés avec Asp.net Ajax 1.0 ont apporté beaucoup de commodité aux développeurs, mais beaucoup d'entre eux ne semblent pas aussi parfaits que nous l'imaginions. J'ai beaucoup utilisé le contrôle AutoComplete récemment et j'ai trouvé plusieurs défauts ou erreurs :
1. Dans certains cas, l'erreur « deux composants avec le même identifiant » se produira ;
2. Il est facile de provoquer le problème « Impossible d'ouvrir le site Internet,..., l'opération a été interrompue » dans IE ;
3. Même si l'utilisateur saisit beaucoup de caractères, même s'il n'y a pas de résultat correspondant, il appellera toujours la méthode serveur pour essayer d'obtenir la valeur correspondante, ce qui augmentera en vain la charge du serveur ;
4. Le style de la liste de saisie semi-automatique n’est pas très agréable ;
5. La signature de la méthode serveur doit être : string[] GetCompletionList(string prefixText, int count). Les autres données requises ne peuvent pas être obtenues du client. Cela est particulièrement fatal lorsqu'il existe plusieurs contrôles de saisie semi-automatique dans une page qui doivent obtenir des données à partir de différentes sources de données.
Pour résoudre ces problèmes, il faut d’abord savoir modifier le code correspondant et le rendre efficace dans votre propre application. Heureusement, les contrôles de la série AjaxControlToolkit sont open source, nous pouvons donc les modifier en fonction de nos propres besoins. Ouvrez la solution AjaxControlToolkit avec VS2005, ouvrez le fichier AutoCompleteBehavior.js dans le dossier AutoComplete, modifiez et recompilez, et mettez à jour le fichier AjaxControlToolkit.dll généré avec votre propre référence de projet pour appliquer notre contrôle AutoComplete optimisé et amélioré.
Alors, quel code spécifique doit être modifié ?
Pour la première question, vous devez ajouter avant la ligne AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose'); :
si (this._popupBehavior) {
this._popupBehavior.dispose();
this._popupBehavior = null ;
}
La deuxième question est de changer la ligne document.body.appendChild(this._completionListElement); en element.parentNode.appendChild(this._completionListElement);
La troisième question est d'utiliser if (text. trim().length < this._minimumPrefixLength); ) Ce jugement ajoute une condition et devient : if (text.trim().length < this._minimumPrefixLength || text.trim().length > 10) , ce qui fait que, lorsque la saisie de l'utilisateur dépasse 10 caractères, il n'y a pas besoin d'appeler le serveur pour lire la valeur correspondante.
Quatrième question, pour ajuster le style de la liste de saisie semi-automatique, vous pouvez directement modifier le code suivant dans la méthode initializeCompletionList :
CompletionListStyle.backgroundColor = this._textBackground ;
finishListStyle.color = this._textColor;
CompletionListStyle.border = 'ombre de bouton solide de 1 px';
complétionListStyle.cursor = 'par défaut';
CompletionListStyle.unselectable = 'non sélectionnable';
CompletionListStyle.overflow = 'hidden';
, ou supprimez ces lignes et ajoutez : element.className = "completionList"; Ajoutez ensuite la définition de la classe de style "completionList" sur la page
pour résoudre le dernier problème, elle devrait être dans { prefixText : this._currentPrefix, count : this._completionSetCount} Ajoutez un paramètre envoyé au serveur dans cette ligne, qui devient :
{ prefixText : this._currentPrefix, count : this._completionSetCount, srcId : this.get_element().getAttribute("srcid") }
Par conséquent, la signature de méthode côté serveur pour lire les éléments de liste de saisie semi-automatique peut être écrite comme suit : string[] GetCompletionList(string prefixText, int count, string srcId). Cela signifie que nous pouvons prédéfinir une chaîne d'identification pour identifier sa source de données pour la zone de texte qui doit appliquer la fonction de saisie semi-automatique. Le code C# est tel que : tb.Attributes.Add("srcid", "xxx". ); Ensuite, dans la méthode GetCompletionList, les données peuvent être lues de manière ciblée en fonction de la valeur du paramètre transmise par le client.