【发布时间】:2017-11-30 19:56:04
【问题描述】:
我有一个非常奇怪的问题,我正在尝试将this answer 实施到我的项目中。这是一个使用 JQuery UI 的简单自动完成文本框。
当我从该答案中复制确切的代码时,它可以完美运行,但我需要从数据库中构建我的选项列表,所以这是我的控制器:
public ActionResult TagSearch(string term)
{
var a = new Access();
var supplierNames = a.GetSuppliers().Select(s => s.SupplierName).ToArray();
return this.Json(supplierNames.Where(t => t.StartsWith(term)),
JsonRequestBehavior.AllowGet);
}
如果我单步执行代码,我可以看到 supplierNames 是一个 string[],包含大约 550 个项目。但是,当我在文本框中输入 term 值时,不会出现下拉菜单。
我试着把控制器分解成
var a = new Access();
var supplierNames = a.GetSuppliers().Select(s => s.SupplierName).ToArray();
var tags = supplierNames.Where(t => t.StartsWith(term)).ToArray();
return this.Json(tags,
JsonRequestBehavior.AllowGet);
但是当我到达var tags = supplierNames.Where(t => t.StartsWith(term)).ToArray(); 行时,调试器就停止了(因为站点仍在运行,但我无法再步进),仍然没有出现自动完成选项。
这怎么可能?如果我根据链接的问题传入一个数组,为什么它可以正常工作,但是当我传入 550 个字符串的数组时,它会失败而没有任何错误?
查看我逐步执行代码的屏幕截图,它看起来应该可以工作,但 UI 无法向我显示选项列表:
查看:
<input type="text" id="tags" />
<script>
$(document).ready(function () {
$('#tags').autocomplete(
{
source: '@Url.Action("TagSearch", "Supplier")'
});
})
</script>
更新
当我构建 string[] 时,只使用前 10 个项目
var supplierNames = a.GetSuppliers().Select(s => s.SupplierName).Take(10).ToArray();
它确实有效,所以它似乎与数组的大小有关,这很奇怪,因为它不像整个 arra 被传递回视图。
我将此添加到我的配置文件中
<system.web.extensions>
<scripting>
<webServices>
<!-- Update this value to change the value to
a larger value that can accommodate your JSON
strings -->
<jsonSerialization maxJsonLength="86753090" />
</webServices>
</scripting>
</system.web.extensions>
并且还尝试将返回值更改为
return new JsonResult()
{
Data = tags,
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
MaxJsonLength = Int32.MaxValue // Use this value to set your maximum size for all of your Requests
};
但没有任何效果。
更新 2
正如 cmets 中所述,错误似乎发生在我调用 StartsWith() 的行上。我通过删除ToArray() 并检查tags.ResultsView.Message 的内容来确定这一点,这表明
对象引用未设置为对象的实例。
仍然不确定为什么会发生这种情况
【问题讨论】:
-
你需要展示你的脚本。
-
尝试将控制器操作中的返回类型更改为
JsonResult而不是ActionResult。 -
@StephenMuecke 我添加了它,但它与链接的问题完全相同。此外,它与样本数据一起工作的事实对我来说也很奇怪。我即将使用真实数据进行测试,但会采用较小的子集
-
@BarryO'Kane 这没有帮助,但是用
var supplierNames = a.GetSuppliers().Select(s => s.SupplierName).Take(20).ToArray();调用数据确实有效,所以这与数组太大的事实有关...... -
奇怪。结果的数量显然没有限制,但显然正在发生一些事情。您可以限制它触发,直到文本框中输入了 3 个字符,这也应该有所帮助。
标签: c# jquery asp.net-mvc autocomplete