【问题标题】:Ajax autocomplete to populate search box from databaseAjax 自动完成从数据库中填充搜索框
【发布时间】:2021-09-09 20:19:55
【问题描述】:

我看到很多关于使用自动完成创建搜索框的问题。我没有看到任何解决我遇到的问题的方法,即我的控制器操作将实际的 json 数据作为页面传递,而不是在页面上传递。我正在使用 ASP.NET Core,并且像大多数建议一样,我正在尝试 return Json 来自控制器操作。这是我的控制器:

    [HttpPost]
    [Route("content")]
    public JsonResult Search(string body)
    {
        var returnObj = _context.Posts.Where(x => x.Body.Contains(body.ToUpperInvariant())
            || x.Title.Contains(body.ToUpperInvariant()))
            .Select(x => new { id = x.Id, title = x.Title, body = x.Body });
        return Json(returnObj);
    }

这是我的 cshtml 和 ajax:

    <form class="form-inline" method="post">
        <input type="hidden" asp-action="Post.Id" />
        <input type="text" id="Title" placeholder="Search" class="form-control" name="body" />
        <button class="btn btn-outline-info" asp-controller="Posts" asp-action="Search"></button>
    </form>

    <script>
        $(document).ready(function) {
            $("#Title").autocomplete({
                source: function(request, response) {
                    $.ajax({
                        url: "/posts/content",
                        type":"POST",
                        dataType: "json",
                        data: { body: request.term },
                        success: function (data) {
                           response($.map(data, function (val, item)) {
                             return { label: val.Title, val: Title}
                           }));
                        }
                     });
                   }
                });
             });
    </script>

我与 ajax 一起使用的表单位于 Layout.cshtml 文件中。当我离开时

    asp-controller="Posts" asp-action="Search"

在我的&lt;button ... &gt;&lt;/button&gt; 标签中,我可以点击我的控制器。当我删除它时,我不能。我假设 ajax 将允许我的表单点击控制器而不是标签助手。

我的目标是让数据在我键入时填充搜索栏,其中来自数据库的数据估计用户键入的内容。但相反,我得到了一个包含 json 数据的新页面。就像你在没有 ajax 的情况下只使用 return Json(""); 时得到的一样。但我做错了吗?为什么我的 ajax 没有按预期触发?

【问题讨论】:

    标签: jquery ajax asp.net-core autocomplete


    【解决方案1】:

    你可以像下面这样改变你的ajax:

    $(document).ready(function () {
            $("#Title").autocomplete({
                source: function (request, response) {
                    $.ajax({
                        url: "/posts/content",
                        type: "POST",
                        dataType: "json",
                        data: { body: request.term },
                        success: function (data) {
                            response($.map(data, function (val,item) {
                                return {
                                    label: val.title,
                                    value: val.id
                                };
                            }));
                        }
                    });
                }
            });
        });
    

    测试结果:

    【讨论】:

    • 我在 layout.cshtml 中添加了多个不同的版本,并收到错误消息“未捕获的类型,自动完成不是功能”。这是我当前拥有的脚本 &lt;script src="https://code.jquery.com/jquery-2.1.1/jquery-min.js"&gt;&lt;/script&gt; 以及 &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;&lt;link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"/&gt;
    • 我正在使用&lt;link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"&gt; &lt;script src="https://code.jquery.com/jquery-1.12.4.js"&gt;&lt;/script&gt; &lt;script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"&gt;&lt;/script&gt;
    • 是的,我正在取得进展,我将其更改为这些并删除了其他一些 &lt;script 我有并且错误消失了,但它仍然无法正常工作。即使没有更多控制台错误,是否有可能是我的 html 表单导致它无法工作?
    • 我在测试的时候,发现如果碰到断点,好像就不行了。您可以尝试取消断点,看看是否有效。
    • 我的意思是它根本没有击中我的控制器。我的控制台或 ajax 上根本没有断点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2011-02-11
    • 2019-02-27
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多