asp.net-mvc - jQuery UI AutoComplete 不过滤来自服务器的响应

标签 asp.net-mvc jquery-ui jquery-ui-autocomplete

我正在使用 jQueryUI AutoComplete,但遇到一个小问题,即当用户在文本框中键入内容时不会进行任何过滤。

基本上,在我输入 3 个字符后,自动填充下拉列表会填充从服务器返回的整个项目集合,但随着输入更多字符,选择范围不会缩小。

关于为什么会发生这种情况有什么想法吗?

客户:

$("#Make").autocomplete({
    minLength: 3,
    source: function (request, response) {
        $.ajax({
            type: "POST",
            url: '@Url.Action("LookupGadgets", "Quote")',
            dataType: "json",
            data: {
                type: $("#Type").val()
            },
            success: function (data) {
                response($.map(data, function (c) {
                    return {
                        label: c.Details,
                        value: c.Details
                    }
                }));
            }
        });
    }
});

服务器:

public ActionResult LookupGadgets(string type)
{
    var retValue = gadgetsRepository.AvailableGadgets
        .Where(x => x.Type == type)
        .OrderBy(x => x.Make)
        .Select(r => new { Details = r.Make + " " + r.Model });
    return Json(retValue);
}

最佳答案

当您使用远程自动完成功能时,小部件希望您进行过滤。从您的操作方法来看,您只是从存储库中选择项目并将它们返回到小部件,因此下拉列表包含所有结果。

如果您想使用远程数据,但希望 jQueryUI 负责过滤(这可能很好,具体取决于数据集的大小),您可以首先通过 AJAX 请求一个项目数组,然后让自动完成处理其余的:

$.ajax({
    type: "POST",
    url: '@Url.Action("LookupGadgets", "Quote")',
    dataType: "json",
    data: {
        type: $("#Type").val()
    },
    success: function (data) {
        var source = $.map(data, function(c) {
            return { label: c.Details, value: c.Details };
        });
        $("#Match").autocomplete({
            source: source,
            minLength: 3
        });
    }
});

如果您的数据集很大,您可能希望避免此策略并在 Controller 操作中执行过滤。如何进行这种过滤实际上取决于您;但是,实现它的一个简单方法是更改​​您的操作方法:

public ActionResult LookupGadgets(string type, string term)
{
    var retValue = gadgetsRepository.AvailableGadgets
        .Where(x => x.Type == type && x.Make.Contains(term))
        .OrderBy(x => x.Make)
        .Select(r => new { Details = r.Make + " " + r.Model });
    return Json(retValue);
}

并稍微更改您的 AJAX 调用:

$.ajax({
    type: "POST",
    url: '@Url.Action("LookupGadgets", "Quote")',
    dataType: "json",
    data: {
        type: $("#Type").val(),
        term: request.term
    },
    success: function (data) {
        response($.map(data, function (c) {
            return {
                label: c.Details,
                value: c.Details
            }
        }));
    }
});

关于asp.net-mvc - jQuery UI AutoComplete 不过滤来自服务器的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6600249/

相关文章:

css - Jquery 选项卡不显示

javascript - 为什么这里没有触发 "input"事件?

javascript - 如何在不触发 @ 或 # 等字符的情况下实现 jquery 自动完成

ajax - MVC 5 Jquery 负载 - 捕获内部异常

c# - 通过依赖注入(inject)执行我的类函数

jQuery UI 对话框按钮定位

javascript - 单击后将多个数组的结果附加到初始生成的 ul,这是如何完成的?

javascript - 将值从 jQuery 自动完成发送到 HiddenField

c# - 渲染的局部 View 与模型不匹配

javascript - ASP.NET MVC 5 从 Javascript 错误调用 Controller 方法