以下jQuery自动完成代码未在MVC3中显示结果。当我调试代码时,我可以看到它正确调用QuickSearchByLastName。有人能告诉我我的代码是否不正确? (我也试过jquery-1.6.2.min.js但没有运气)谢谢!
Index.cshtml:
@using (Ajax.BeginForm(new AjaxOptions
{
HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "results"
}
))
{
<input type="text" name="q" data-autocomplete="@Url.Action("QuickSearchByLastName","Search")" />
}
<div id="results" >
</div>
----------------------------------------------------------------
Search Controller:
public ActionResult QuickSearchByLastName(string term)
{
using (var context = new CSCContext())
{
var searchResults = context.Students
.Where(s => s.LastName.Contains(term) && s.IsActive == true)
.Take(10)
.Select(s => new { label = s.LastName });
return Json(searchResults, JsonRequestBehavior.AllowGet);
}
}
_Layout.cshtml:
@Content.Script("jquery-1.4.4.min.js", Url)
@Content.Script("jquery.unobtrusive-ajax.min.js", Url)
@Content.Script("jquery-ui.min.js", Url)
@Content.Script("jquery.validate.min.js", Url)
@Content.Script("jquery.validate.unobtrusive.min.js", Url)
@Content.Script("CSC.js", Url)
@RenderSection("scripts", false)
CSC.js
$(document).ready(function ()
{
$(":input[data-autocomplete]").each(function ()
{
$(this).autocomplete({
source: $(this).attr("data-autocomplete")
}
);
});
});
以下代码修复了此问题:
public ActionResult QuickSearchByLastName(string term)
{
var context = new CSCContext();
try
{
var searchResults = context.Students
.Where(s => s.LastName.Contains(term) && s.IsActive == true)
.Take(10)
.Select(s => new { label = s.LastName });
return Json(searchResults.ToList(), JsonRequestBehavior.AllowGet);
}
finally
{
context.Dispose();
}
}
答案 0 :(得分:5)
我试过复制你的场景无济于事,因为它一直对我有用。这就是我做的。
HomeController中:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult QuickSearchByLastName(string term)
{
var results = Enumerable
.Range(1, 5)
.Select(x => new {
id = x,
label = "label " + x,
value = "value " + x
});
return Json(results, JsonRequestBehavior.AllowGet);
}
}
Index.cshtml
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/themes/base/jquery-ui.css" type="text/css" media="all" />
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$(':input[data-autocomplete]').each(function () {
$(this).autocomplete({
source: $(this).attr('data-autocomplete')
});
});
});
</script>
@using (Html.BeginForm())
{
<input type="text" name="q" data-autocomplete="@Url.Action("QuickSearchByLastName", "Home")" />
}
我使用了jquery-1.5.1.min.js
和jquery-ui-1.8.11.min.js
,它们默认与ASP.NET MVC 3 RTM捆绑在一起。我也尝试将它放在Ajax.BeginForm
中,并导入默认的不显眼的脚本,它仍然适用于我。
答案 1 :(得分:1)
由于某种原因,脚本文件
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
需要包含在顶部,而不是在任何文件底部指定以提高性能。
如果你这样做会有效。
答案 2 :(得分:1)
简答:请参阅此帖jQuery UI autocomplete with ASP.NET Web API
答案很长:
第1步:准备好网络准备
让我们首先创建一个 web api方法,它将使用从自动填充文本框发送的搜索字词查询返回项目列表(艺术家)。在这篇文章中,我没有使用数据库,而是使用List来保持这个例子尽可能简单。
以下是我定义Artist类的方法
public class Artist
{
public int Id { get; set; }
public int Name { get; set; }
}
接下来,我创建了一个 Web Api GET方法,它将使用在自动填充文本框中输入的搜索词,并在LINQ的帮助下返回匹配结果列表。
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace Autocomplete.Controllers
{
public class ArtistApiController : ApiController
{
public List<Artist> ArtistList = new List<Artist>
{
new Artist{Id = 1, Name = "Sonu Nigam"},
new Artist{Id = 2, Name = "Sunidhi Chauhan"},
new Artist{Id = 3, Name = "Shreya Goshal"},
new Artist{Id = 4, Name = "Mohit Chauhan"},
new Artist{Id = 5, Name = "Nihkil Dsouza"},
new Artist{Id = 6, Name = "Kailash Kher"},
new Artist{Id = 7, Name = "Atif Aslam"},
new Artist{Id = 8, Name = "Ali Zafar"},
new Artist{Id = 9, Name = "Shafaqat Ali"},
new Artist{Id = 10, Name = "Shankar Madahevan"}
};
// GET api/values
public IEnumerable<Artist> Get(string query)
{
return ArtistList.Where(m => m.Name.Contains(query)).ToList();
}
}
}
我们的服务器端代码准备就绪!是时候测试一下了。
第2步:客户端代码
在你的html中加入jquery-ui.js和jquery.ui.css
<script type="text/javascript" src="~/Scripts/jquery-1.7.1.min.js" ></script>
<script type="text/javascript" src="~/Scripts/jquery-ui-1.8.20.min.js" ></script>
<link href="~/Content/themes/base/jquery.ui.all.css" rel="stylesheet" />
<div id="body">
<label for="autocomplete-textbox">Search : </label>
<input type="text" id="autocomplete-textbox" />
</div>
<script type="text/javascript">
$(document).ready(function (){
$('#autocomplete-textbox').autocomplete({
source: function (request, response) {
// prepare url : for example '/api/artistapi?query=sonu
var autocompleteUrl = '/api/artistapi' + '?query=' + request.term;
$.ajax({
url: autocompleteUrl,
type: 'GET',
cache: false,
dataType: 'json',
success: function (json) {
// call autocomplete callback method with results
response($.map(json, function (data, id) {
return {
label: data.Name,
value: data.Id
};
}));
},
error: function (xmlHttpRequest, textStatus, errorThrown) {
console.log('some error occured', textStatus, errorThrown);
}
});
},
minLength: 2,
select: function (event, ui) {
alert('you have selected ' + ui.item.label + ' ID: ' + ui.item.value);
$('#autocomplete-textbox').val(ui.item.label);
return false;
}
});
});
</script>
这里需要注意的一点是,在成功方法中我使用了以下代码:
response($.map(json, function (data, id) {
return {
label: data.Name,
value: data.Id
};
}));
使用了data.Id 和 data.Name ,因为在ajax响应中(如下所示),数据以此格式返回。
第3步:测试&amp;输出:
取自here
答案 3 :(得分:0)
我遇到了与rk1962相同的问题(快速网络搜索显示很多其他人都有同样的问题)。我从上面复制了Darin的代码并且它有效。当我从Index.cshtml顶部获取脚本并将其放在一个单独的脚本文件中时它停止工作 - QuickSearchByLastName不会被调用。
安德鲁