Html.TextBox上的自动填充功能无效

时间:2016-03-02 10:22:35

标签: javascript c# asp.net-mvc jquery-ui

所以,我已经搜索了很多并经历了很多教程,尽管我完全按照教程中的所有内容完成,但我似乎无法让它工作。有趣的是,我参与了一个项目,在那里我们使用了完全相同的解决方案并且有效。

我的论坛中有一个文本框,用户可以搜索所有类别中的线程,我使用ajax以部分视图的形式显示div的结果。这很有效。

问题是我希望当用户输入时,包含当前搜索词的主题主题(以正常字符串的形式)显示,但我似乎无法得到自动完成权的实现。顺便说一下,我从MSSQL数据库中检索我的信息。

这是我用来自动完成的javascript(不能正常工作),下面你可以看到我用于搜索的Ajax表单(有效):

<link href="~/Content/jquery-ui.min.css" rel="stylesheet" />
<script src="~/Scripts/jquery-ui.min.js"></script>

@*Scripts for  Ajax to show the partial view in the div with id "partialThreads" at request*@
<script src="~/Scripts/jquery-2.2.1.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>



<script type="text/javascript">
    $(function () {

        $("#txtSearch").autocomplete({
            source: '@Url.Action("GetThreadsBySearch", "Forum")'
        });
    });

</script>


@using (@Ajax.BeginForm("Threads", new AjaxOptions() { UpdateTargetId = "partialThreads", InsertionMode = InsertionMode.Replace, HttpMethod = "POST" }))
{
    @Html.AntiForgeryToken()
    <p><strong>Search for thread in all categories</strong></p>
    @Html.TextBox("searchTerm", null, new { id = "txtSearch", style = "width: 1000px" })
    <input type="submit" value="Search" />
}

这是div,我以局部视图的形式显示搜索结果:

<div id="partialThreads">

</div>

以下是我用于ajax-form搜索的动作方法(工作方式):

    [HttpPost, ValidateAntiForgeryToken]
    public ActionResult Threads(string searchTerm)
    {
        var model = string.IsNullOrWhiteSpace(searchTerm)
            ? new List<ThreadsListModel>()
            : _threadRepo.GetThreadsBySearch(searchTerm).OrderByDescending(x => x.DateCreated).ToList();

        return PartialView("_Threads", model);
    }

以下是我用来检索自动填充信息的方法(我已尝试在其上设置断点,它甚至不会中断):

    public JsonResult GetThreadsBySearch(string term)
    {
        var threadNames = _threadRepo.GetThreadsBySearch(term).Select(x => x.Subject).ToList();
        return Json(threadNames, JsonRequestBehavior.AllowGet);
    } 

请注意,我使用相同的db-query来搜索表单和自动完成(唯一的区别是我在 GetThreadsBySearch 方法中选择了线程名作为List。所以可以'是问题(?)。这是查询方法,以防你想看看:

    public ICollection<ThreadsListModel> GetThreadsBySearch(string subject)
    {
        using (var context = new ForumContext())
        {
            return
                context.Threads.Where(x => x.Subject.ToLower().Contains(subject.ToLower()) && x.IsActive)
                    .Select(x => new ThreadsListModel()
                    {
                        ID = x.ID,
                        DateCreated = x.DateCreated,
                        CreatedBy = x.CreatedBy,
                        Subject = x.Subject,
                        PostsCount = x.Posts.Count
                    }).Distinct().ToList();
        }
    }

另外,我使用的是Visual Studio 2015(.NET 4.5.2)MVC 5.我希望我没有忘记写下任何有用的信息。

2 个答案:

答案 0 :(得分:1)

您的脚本顺序错误,jquery需要在jquery-ui之前(并且还要确保您没有任何重复的脚本)

答案 1 :(得分:0)

 $("#MainContent_txtCountry").autocomplete({
    source: function (request, response) {
        var param = { keyword: $('#MainContent_txtCountry').val() };
        $.ajax({
            url: "Default.aspx/GetCountryNames",
            data: JSON.stringify(param),
            dataType: "json",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataFilter: function (data) { return data; },
            success: function (data) {
                response($.map(data.d, function (item) {
                    return {
                        value: item
                    }
                }))
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert(textStatus);
            }
        });
    },

   });