Complétion automatique avec jQuery et le répéteur asp.net remplit l’identifiant

J’ai un asp: Zone de texte avec la saisie semi-automatique, les données proviennent d’un service Web et renvoie les données Json. Lorsqu’un élément est sélectionné, il met une valeur (id) dans un champ “masqué” et le prix dans une autre zone de texte. Tout cela fonctionne bien. Mais quand je mets plus ou moins le même code dans un asp: répéteur, il ne fait pas la saisie semi-automatique.

Ceci est un extrait de mon code asp:

   

....
<asp:TextBox runat="server" ID="txtItem" Text='' class="txtItemclass" /> <asp:TextBox runat="server" ID="txtPrice" value=''/>

Ceci est mon code jQuery:

 $(document).ready(function () { //this handles the textbox out of the repeater $.ajax({ type: "POST", url: "AutoCompleteItems.asmx/GetItemJ", dataType: "json", data: "{ 'data': '" + document.getElementById("txtItem2").value + "' }", contentType: "application/json; charset=utf-8", success: function (data) { $('#txtItem2').autocomplete({ minLength: 0, source: data.d, focus: function (event, ui) { $('#txtItem2').val(ui.item.value); return false; }, select: function (event, ui) { $('#txtItem2').val(ui.item.ItemCode + " " + ui.item.Description); $('#txtHiddenItemID2').val(ui.item.ID); $('#txtPrice2').val(ui.item.Price); return false; } }); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + errorThrown); } }); //this handles the textbox in the repeater $(".ItemAutoComplete").each(function (i, element) { var txtItem = $(this).find('input[id*=txtItem]:first') var txtHiddenItemID = $(this).find('input[id*=txtHiddenItemID]:first') var txtPrice = $(this).find('input[id*=txtPrice]:first') $.ajax({ type: "POST", url: "AutoCompleteItems.asmx/GetItemJ", //async: false, //cache: false, dataType: "json", data: "{ 'data': '" + txtItem.val() + "' }", contentType: "application/json; charset=utf-8", success: function (data) { txtItem.autocomplete({ minLength: 0, source: data.d, focus: function (event, ui) { txtItem.val(ui.item.value); return false; }, select: function (event, ui) { txtItem.val(ui.item.ItemCode + " " + ui.item.Description); txtHiddenItemID.val(ui.item.ID); txtPrice.val(ui.item.Price); return false; } }); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + errorThrown); } }); }); }); 

Ceci est ma méthode Web (qui fonctionne avec la zone de texte) avec la classe:

 [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public List GetItemJ(ssortingng data) { List ItemJs = new List(); //if (Request.QuerySsortingng["q"] != null) //{ try { DataContext d = new DataContext(); List typeList = "PR".Split(" ".ToCharArray()).ToList(); //List conditionList = "ADF".Split(" ".ToCharArray()).ToList(); ItemJs = (from i in d.Items join a in d.ItemAssortments on i.Assortment equals a.Assortment where a.SecurityLevel <= 999 where i.SecurityLevel <= 999 && a.SecurityLevel <= 999 && i.IsSalesItem == true && !typeList.Contains(i.Type.ToString()) && (new string[] { "A", "D", "F" }).Contains(i.Condition.ToString()) && (SqlMethods.Like(i.Description, "%" + data + "%") || SqlMethods.Like(i.ItemCode, data + "%")) orderby i.ItemCode select new ItemJ { //value = i.ItemCode,// + " " + i.ItemCode + " ", ItemCode = i.ItemCode, Description = i.Description, //+ " " + i.ItemCode + " ", ID = i.ID.ToString(), Price = i.PurchasePrice.ToString() }).Take(10).ToList(); } catch (Exception ex) { throw new Exception(ex.Message); //return null; } //} return ItemJs; } public class ItemJ //: Item { //string _name; string _value; public string value { get { return _Description + " (" + _ItemCode + ")"; } //set { _value = value; } } string _Description; public string Description { get { return _Description; } set { _Description = value; } } string _ID; public string ID { get { return _ID; } set { _ID = value; } } string _ItemCode; public string ItemCode { get { return _ItemCode; } set { _ItemCode = value; } } string _Price; public string Price { get { return _Price; } set { _Price = value; } } } 

J’ai passé des heures là-dessus, quelqu’un peut-il me donner un indice?

En gros, le problème est que votre zone de texte est placée dans le contrôle du répéteur, car jquery n’est pas en mesure d’identifier un identifiant unique pour le contrôle, donc insted de jquery autocomplete

Essayez AutoCompleteExtender, il vous donnera la sortie désirée.

Pourriez-vous essayer de supprimer les identifiants des contrôles dans ItemAutoComplete Div et effectuer une recherche par classe. J’ai eu ce problème lorsque j’essaie d’accéder au contrôle dans le contrôle de répéteur via Id, car tous les ID doivent être uniques dans une page. alors au lieu de

 var txtItem = $(this).find('input[id*=txtItem]:first') 

essayer

 var txtItem = $(this).find('.txtItemClass') 

HTH