【发布时间】:2012-06-20 18:19:52
【问题描述】:
背景
目前在我的一个项目中,我在几个领域使用 jQuery autocomplete。
为了提供上下文,应用程序记录Runs。每个Run 必须有一个与之关联的Route。 Route 意思是用户跑到哪里。
当用户输入Route 时,autocomplete 选项会显示他们的Routes 列表,但数据库需要RouteID 进行验证。
为了弥补这一点,我将RouteID 存储在HiddenFor HtmlHelper 中。当用户从autocomplete 中选择路由时,HiddenFor 被分配。
我的问题是什么
如果用户键入Route 的全名,而不是从autocomplete 列表中选择它或输入一个不存在的Route,HiddenFor 将不会被分配。发生这种情况时,我必须通过其名称找到 Route 并验证它是否存在于服务器上。
我希望不必为每个 autocomplete 创建此解决方法。
底线
有没有办法让autocomplete 更像select list?我希望用户别无选择,只能从autocomplete 列表中选择一个选项的文本,并将所选选项的值发送到服务器。
如果我必须坚持HiddenFor 方法,是否至少有一种方法可以强制用户从autocomplete 列表中选择一个选项?
下面是我目前使用的代码
标记
@Html.LabelFor(model => model.RouteID, "Route")
<input type="text" data-autocomplete-url="@Url.Action("../Route/GetRoutesByUser")" />
@Html.HiddenFor(m => m.RouteID)
jQuery
$('*[data-autocomplete-url]')
.each(function () {
$(this).autocomplete({
source: $(this).data("autocomplete-url"),
minLength: 2,
select: function (event, ui) {
log(ui.item.id, ui.item.name);
}
});
});
代码
public ActionResult GetRoutesByUser(string term)
{
var routeList = db.Routes.Where(r => r.Name.Contains(term))
.Take(5)
.Select(r => new { id = r.RouteID, label = r.Name, name = "RouteID"});
return Json(routeList, JsonRequestBehavior.AllowGet);
}
【问题讨论】:
标签: jquery asp.net asp.net-mvc asp.net-mvc-3 jquery-ui-autocomplete