1

我有一个用于在员工之间进行搜索的搜索字段。视图的代码如下所示:

<input id="employeeSearchText" name="employeeSearchText" type="text" autocomplete="off" />  

<script type="text/javascript" language="javascript">
    $("#employeeSearchText").autocomplete({
        source: function (request, response) {
            $.ajax({
                url: "/Medarbejdere/Soeg",
                type: "POST",
                dataType: "json",
                data: { searchText: request.term },
                success: function (data) {
                    response($.map(data, function (item) {
                        return { label: item.Firstname + " " 
                 + item.Lastname, value: item.description, id: item.description }
                    }))
                }
            })
        }
    });
</script>

路径“/Medarbejdere/Soeg”在控制器中定义为:

[HttpPost]
public JsonResult Soeg(string searchText)
{
    EmployeeRepository repo = new EmployeeRepository();
    var result = repo.SearchByKeywords(searchText.Trim(), 10);
    return Json(result, JsonRequestBehavior.AllowGet);
}

我的问题是,对于某些输入,结果永远不会出现。实际上只输入一个字母并等待输入,英文字母表中相同的 5 个字母永远不会返回结果,始终如一。

在所有输入的“Soeg”操作中放置一个断点,并且 repo.SearchByKeywords() 也为所有输入返回正确的结果,但由于某种原因,当结果返回给 AJAX 调用时,它永远不会呈现。

我完全不知道在这个阶段如何进行调试。我使用 MVC 迷你分析器,它显示了以下行为(假设字母“c”不给出结果,而字母“e”给出)

键入“e”将触发对操作的调用,触发断点,浏览器左侧的 mvc-mini-profiler 调试信息将显示调用花费了多长时间。键入“c”将触发对操作的调用,触发断点,但不会显示在 mvc-mini-profiler 调试窗口中。

现在,如果我键入另一个“c”以使搜索字符串为“cc”,分析器实际上会显示两个对操作的调用,但仅在键入第二个“c”时

有关如何进一步调试问题的解决方案甚至建议的任何想法?

提前致谢!

4

1 回答 1

1

显然问题是由 repo.SearchByKeywords() 的结果引起的。

虽然结果是正确的,但在以 JSON 形式返回时,它会以某种方式破坏某些输入的自动完成功能。

根本原因是返回的数据类型是 SQL Server 中定义的数据类型,它引用了其他表。如果单个元素上的一个引用为空(在业务逻辑的其他部分完全没问题),自动完成小部件会以某种方式导致错误。

我通过返回一个更简单的数据结构而不是来自数据库的实际表来缓解这种情况,其中包含固定数量的从不为空的字段。

于 2012-10-11T19:39:44.790 回答