【问题标题】:Autocomplete works with sample data but fails with real data自动完成适用于样本数据,但适用于真实数据
【发布时间】: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 =&gt; s.SupplierName).Take(20).ToArray(); 调用数据确实有效,所以这与数组太大的事实有关......
  • 奇怪。结果的数量显然没有限制,但显然正在发生一些事情。您可以限制它触发,直到文本框中输入了 3 个字符,这也应该有所帮助。

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


【解决方案1】:

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

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

因此,一个简单的解决方案是将我的数据调用更改为

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

现在可以完美运行了。

【讨论】:

    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2016-05-02
    • 2020-12-10
    • 1970-01-01
    • 2019-09-24
    • 2015-11-21
    相关资源
    最近更新 更多