ASP.NET MVC中JQuery Autocomplete TextBox无法正常工作的排查请求
让我们一步步拆解这个自动补全失效的问题:
核心报错原因
你看到的Uncaught TypeError: this.source is not a function,本质是jQuery UI Autocomplete没有拿到有效的数据源地址——因为你的JS代码获取数据源URL的方式和HTML里的属性名不匹配,导致source参数为undefined,进而触发了这个错误。
具体修复步骤
1. 修正JS中获取数据源URL的代码
在你的MonScript.js里,当前用target.attr("data_autocomplete_source")去获取属性,但ASP.NET MVC会把Razor里的@data_autocomplete_source转换成HTML属性data-autocomplete-source(下划线自动转短横线)。所以你需要改成以下两种方式之一:
推荐方式(用jQuery的data()方法,自动处理命名转换):
$(function () { $("input[data-autocomplete-source]").each(function () { var target = $(this); var sourceUrl = target.data("autocompleteSource"); // 短横线转驼峰命名 target.autocomplete({ source: sourceUrl }); }); });
或者用attr()方法匹配正确的HTML属性名:
$(function () { $("input[data-autocomplete-source]").each(function () { var target = $(this); var sourceUrl = target.attr("data-autocomplete-source"); target.autocomplete({ source: sourceUrl }); }); });
2. 给AutoComplete控制器方法明确添加[HttpGet]标记
jQuery UI Autocomplete默认会发送GET请求到指定URL,虽然ASP.NET MVC的Action默认允许GET,但明确标注可以避免路由匹配的潜在问题:
[HttpGet] // 添加这个标记 public JsonResult AutoComplete(string term) { var model = _repository.FetchGeneralStudentSearchResult(term); return Json(model, JsonRequestBehavior.AllowGet); }
3. 确保返回的JSON格式符合jQuery UI要求
jQuery UI Autocomplete只接受两种格式的数据源:
- 纯字符串数组:比如
["张三", "李四", "赵六"] - 包含
label和value属性的对象数组(label是下拉显示的文本,value是选中后填充到输入框的值):// 示例:如果你的Student实体有Name属性,返回这样的结构 var result = _repository.FetchGeneralStudentSearchResult(term) .Select(s => new { label = s.Name, value = s.Name }); return Json(result, JsonRequestBehavior.AllowGet);
4. 检查脚本加载顺序与重复加载
确认你的页面没有重复加载jQuery或jQuery UI——如果布局页已经加载了jQuery,视图里的<script src="~/Scripts/jquery-3.3.1.js"></script>就需要删掉,重复加载会导致jQuery UI的绑定失效。当前你的脚本顺序是对的(先jQuery,再jQuery UI,再其他脚本),这部分没问题,但要避免重复引入。
验证修复
修改完成后,刷新页面,打开浏览器开发者工具的网络标签,在搜索框输入内容,你应该能看到发送到/Admin/AutoComplete的GET请求,并且返回了正确的JSON数据,自动补全下拉框也会正常显示。
内容的提问来源于stack exchange,提问作者L. Landenne

