Автозаполнение ASP.NET MVC jQuery со значением и текстовым полем
контроллер
public ActionResult Search(string id)
{
id= Request.QueryString["term"];
var routeList = db.Movies.Where(r => r.Title.Contains(id))
.Take(5)
.Select(r => new { id = r.MovieID, label = r.Title, name = "MovieID" });
return Json(routeList, JsonRequestBehavior.AllowGet);
}
Вид:
<input type="hidden" id="MovieID" name="MovieID" />
<input type="text" id="SelectedMovie" value=""/>
<script type="text/javascript" language="javascript">
$("#SelectedMovie").autocomplete({
source: function (request, response) {
$.ajax({
url: "/Transaction/Search", type: "POST", dataType: "json",
data: { id: request.term },
success: function (data) {
response($.map(data, function (item) {
return { label: item.label, value: item.id }; //updated code
}));
}
});
},
select: function (event, ui) {
$("#MovieID").val(ui.item.value);
$("#SelectedMovie").val(ui.item.label);
return false;
}
});
</script>
У меня есть какое-то приложение для видеозаписей. Когда я иду снимать фильм, мне нужна сводка с фильмами, которую я могу выбрать, используя автозаполнение.
Также необходимо, чтобы только идентификатор (значение) сохранялся в базах данных, а не в самом тексте.
EDIT: вот полный рабочий exqample
Ответы
Ответ 1
Поскольку вы передаете только строку функции Search()
на стороне сервера, элементы data
, которые вы передаете по вызову $.ajax()
, необходимо изменить.
public ActionResult Search(string id)//I think that the id that you are passing here needs to be the search term. You may not have to change anything here, but you do in the $.ajax() call
{
id= Request.QueryString["term"];
var routeList = db.Movies.Where(r => r.Title.Contains(id))//this is a text filter no?
.Take(5)
.Select(r => new { id = r.MovieID, label = r.Title, name = "MovieID" });
return Json(routeList, JsonRequestBehavior.AllowGet);
}
$("#MovieID").autocomplete({
source: function (request, response) {
$.ajax({
url: "/Transaction/Search", type: "POST", dataType: "json",
//original code
//data: { searchText: request.id, maxResults: 10 },
//updated code; updated to request.term
//and removed the maxResults since you are not using it on the server side
data: { id: request.term },
success: function (data) {
response($.map(data, function (item) {
//original code
//return { label: item.FullName, value: item.FullName, id: item.TagId };
//updated code
return { label: item.label, value: item.label, id: item.id };
}));
},
select: function (event, ui) {
//update the jQuery selector here to your target hidden field
$("input[type=hidden]").val(ui.item.id);
}
});
},
});
Сообщите мне, если это работает/помогает!
Ответ 2
Ваш вызов .ajax()
не указывается в id
. это не в вашем объекте data{}
, а также в querystring
как часть параметра url (любой из них будет работать).
Следовательно, значение null в вашем методе Action.
В любом случае, вы сразу переписываете аргумент id метода с помощью Request.QueryString["term"]
. Зачем это делать?
Вместо того, чтобы запрашивать "термин" внутри метода, вы просто привяжите это к методу Action
как к самому параметру, как показано ниже:
public ActionResult Search(string term)
{
var routeList = db.Movies.Where(r => r.Title.Contains(term))
.Take(5)
.Select(r => new { id = r.MovieID, label = r.Title, name = "MovieID" });
return Json(routeList, JsonRequestBehavior.AllowGet);
}
Ответ 3
Во-первых, вы должны использовать следующее возвращаемое значение из вашей функции:
return { label: item.title, value: item.id };
В соответствии с документацией вам нужно вернуть объекты с свойствами label
и value
(свойство id
). Метка - это то, что видит пользователь, значение - это то, что отправлено на сервер.
Во-вторых, вы передаете searchText
и maxResults
в вызове Ajax, поэтому ваш метод действия должен иметь два параметра: public ActionResult Search(string searchText, int maxResults)
.
Можете ли вы применить эти изменения и посмотреть, работает ли он?