背景
目前在我的一个项目中,我在autocomplete
几个领域使用 jQuery。
为了提供上下文,应用程序记录Runs
. 每个都Run
必须有一个Route
与之关联的。一个Route
含义,用户跑到哪里。
当用户输入 a时,选项会显示Route
他们的列表,但数据库需要验证。Routes
autocomplete
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);
}