在 ASP.NET MVC 错误中创建自动完成

Creating an autocomplete in ASP.NET MVC error

我正在尝试使用 jquery 自动完成在 ASP.NET MVC 中创建一个自动完成文本框。

这是我的 Index.cshtml:

<div class="autocomplete">
    @Html.TextBox("item", null, new { id = "autocomplete-textbox", @class = "form-control" });
    <input type="submit" value="Submit" id="autocomplete-button"/>
</div>

<script>
    $(function() {
        $('#autocomplete-textbox').autocomplete({
            source: '@Url.Action("AutoComplete")',
            minlength: 1
        });
    });
</script>

这是我的家庭控制器方法:

public JsonResult AutoComplete(string item)
    {

        IEnumerable<string> itemsList = new[] { "Ana", "are", "mere", "pere", "papaia", "Aaa", "Ab", "An" };
        IEnumerable<string> filteredResults = null;

        if (string.IsNullOrEmpty(item))
        {
            filteredResults = itemsList;
        }
        else
        {
            filteredResults = itemsList.Where(s => s.IndexOf(item, StringComparison.InvariantCultureIgnoreCase) >= 0);
        }

        return Json(filteredResults, JsonRequestBehavior.AllowGet);
    }

我的问题是 JsonResult AutoComplete 中的参数项始终为 null,因此我总是得到整个列表的 JSON 响应。我能做什么?

谢谢, 马库斯

默认情况下,jQuery 自动完成插件将发送带有名为 term 的查询字符串参数的键入值,而不是项目(如果您打开可以看到这个打开你的浏览器开发工具->网络选项卡)。

因此将您的服务器操作方法参数名称更改为 term

public JsonResult AutoComplete(string term)
{
  // use term for your checkings
  // to do : Return something    
}

此外,我注意到您的代码中存在另一个问题。如果术语变量不为空,则需要将筛选结果(Where 方法调用的结果)设置为 filteredResults 变量,因为它是您要返回的内容。

if (string.IsNullOrEmpty(term))
{
    filteredResults = itemsList;
}
else
{
    filteredResults = itemsList
             .Where(s => s.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) >= 0);
}

只是您必须将控制器中使用的参数命名为 "term",因为 jquery 自动完成小部件默认情况下会在名为 "term" 的变量中发送值.因此只需更改如下:

public JsonResult 自动完成(字符串项) {

    IEnumerable<string> itemsList = new[] { "Ana", "are", "mere", "pere", "papaia", "Aaa", "Ab", "An" };
    IEnumerable<string> filteredResults = null;

    if (string.IsNullOrEmpty(term))
    {
        filteredResults = itemsList;
    }
    else
    {
        filteredResults = itemsList.Where(s => s.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) >= 0);
    }

    return Json(filteredResults, JsonRequestBehavior.AllowGet);
}