所以,我已经搜索了很多并经历了很多教程,尽管我完全按照教程中的所有内容完成,但我似乎无法让它工作。有趣的是,我参与了一个项目,在那里我们使用了完全相同的解决方案并且有效。
我的论坛中有一个文本框,用户可以搜索所有类别中的线程,我使用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.我希望我没有忘记写下任何有用的信息。
答案 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);
}
});
},
});