我有一个非常奇怪的问题,我正试图在我的项目中实现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>
当我仅使用带有
的前10个项目构建string[]
时
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
};
但没有任何效果。
正如评论中所提到的,似乎错误发生在我调用StartsWith()
的行上。我通过删除ToArray()
并检查显示
tags.ResultsView.Message
的内容来确定了这一点
对象引用未设置为对象的实例。
仍然不确定为什么会发生这种情况
答案 0 :(得分:1)
事实证明,这是数据完整性的问题,因为Suppliers
中有一条SupplierName
值为NULL
的记录。
这意味着当我调用StartsWith()
时,它必须在到达该记录时抛出空引用异常(对我来说这很奇怪,linq对此没有更多信息,或者它无法处理null值返回false)。
因此,对此的简单解决方法是将我的数据调用更改为
var supplierNames = a.GetSuppliers()
.Select(s => s.SupplierName)
.Where(s => s != null).ToArray();
它现在完美无缺。