从ASP.NET后台添加多个AJAX AutocompleteExtender仅一个生效问题
确认控件已加入页面控件树
后台实例化AutoCompleteExtender后,必须通过Controls.Add(acl)将其添加到正确的容器(比如目标文本框的父容器、Page.Form或指定Panel)。如果只创建对象但未加入控件树,ASP.NET不会渲染对应的前端<ul>元素,这是最常见的原因。验证目标文本框的有效性
检查tbc.ID对应的文本框是否已正确添加到控件树,且ID在当前命名容器中唯一。若目标文本框不存在或ID重复,Extender无法完成绑定,自然不会生成完成列表元素。可通过打印tbc.ClientID确认前端能找到该DOM元素。避免BehaviorID手动赋值冲突
代码中手动将BehaviorID设为与ID一致,可能引发全局BehaviorID冲突(页面中其他AJAX控件可能使用相同命名规则)。建议移除acl.BehaviorID = acl.ID这行代码,让控件自动生成唯一的BehaviorID,避免脚本逻辑异常。检查ScriptManager配置
页面必须且只能有一个ScriptManager控件,且EnablePartialRendering属性需设为true。多ScriptManager或配置错误会导致AJAX脚本加载异常,阻止部分Extender初始化。同时确保AjaxControlToolkit的后台版本与ScriptManager引用的脚本版本一致。前端调试定位脚本错误
打开浏览器开发者工具(F12),查看控制台是否有JavaScript错误(如找不到目标控件、脚本加载失败),这类错误会直接导致Extender无法生成完成列表。也可在网络标签中检查GetColors服务方法是否能被所有Extender正常调用。
修正后的示例代码
var acl = new AjaxControlToolkit.AutoCompleteExtender(); acl.TargetControlID = tbc.ID; acl.ID = $"ACE_{partno}_{r.ParameterNo}"; // 移除手动设置BehaviorID,使用自动生成的唯一值 // acl.BehaviorID = acl.ID; acl.ServiceMethod = "GetColors"; acl.MinimumPrefixLength = 1; acl.CompletionInterval = 100; acl.EnableCaching = false; acl.CompletionSetCount = 10; acl.FirstRowSelected = false; acl.ShowOnlyCurrentWordInCompletionListItem = true; acl.CompletionListCssClass = "autocomplete_completionListElement"; // 关键步骤:将Extender添加到目标文本框的父容器中 tbc.Parent.Controls.Add(acl);
内容的提问来源于stack exchange,提问作者Peter Häggmyr

