自动填充功能可与样本数据配合使用但无法使用实际数据

时间:2017-11-30 10:52:59

标签: c# jquery asp.net-mvc autocomplete

我有一个非常奇怪的问题,我正试图在我的项目中实现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);
}

如果我单步执行代码,我可以看到supplierNamesstring[],包含大约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无法向我显示选项列表:

enter image description here

查看:

<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
};

但没有任何效果。

更新2

正如评论中所提到的,似乎错误发生在我调用StartsWith()的行上。我通过删除ToArray()并检查显示

tags.ResultsView.Message的内容来确定了这一点
  

对象引用未设置为对象的实例。

仍然不确定为什么会发生这种情况

1 个答案:

答案 0 :(得分:1)

事实证明,这是数据完整性的问题,因为Suppliers中有一条SupplierName值为NULL的记录。

这意味着当我调用StartsWith()时,它必须在到达该记录时抛出空引用异常(对我来说这很奇怪,linq对此没有更多信息,或者它无法处理null值返回false)。

因此,对此的简单解决方法是将我的数据调用更改为

var supplierNames = a.GetSuppliers()
    .Select(s => s.SupplierName)
    .Where(s => s != null).ToArray();

它现在完美无缺。