Я работаю над проектом MVC, где мне нужно предоставить автозаполнение формы. Я использую jquery для этого, но проблема в том, что когда я жестко кодирую список в скрипте, он работает отлично, в противном случае это не так.
Сценарий, который я использовал:
<script>
function autocomplete(inp, arr) {
var currentFocus;
inp.addEventListener("input", function (e) {
var a, b, i, val = this.value;
closeAllLists();
if (!val) { return false; }
currentFocus = -1;
a = document.createElement("DIV");
a.setAttribute("id", this.id + "autocomplete-list");
a.setAttribute("class", "autocomplete-items");
this.parentNode.appendChild(a);
for (i = 0; i < arr.length; i++) {
if (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) {
b = document.createElement("DIV");
b.innerHTML = "<strong>" + arr[i].substr(0, val.length) + "</strong>";
b.innerHTML += arr[i].substr(val.length);
b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
b.addEventListener("click", function (e) {
inp.value = this.getElementsByTagName("input")[0].value;
closeAllLists();
});
a.appendChild(b);
}
}
});
inp.addEventListener("keydown", function (e) {
var x = document.getElementById(this.id + "autocomplete-list");
if (x) x = x.getElementsByTagName("div");
if (e.keyCode == 40) {
currentFocus++;
addActive(x);
} else if (e.keyCode == 38) {
currentFocus--;
addActive(x);
} else if (e.keyCode == 13) {
e.preventDefault();
if (currentFocus > -1) {
if (x) x[currentFocus].click();
}
}
});
function addActive(x) {
if (!x) return false;
removeActive(x);
if (currentFocus >= x.length) currentFocus = 0;
if (currentFocus < 0) currentFocus = (x.length - 1);
x[currentFocus].classList.add("autocomplete-active");
}
function removeActive(x) {
for (var i = 0; i < x.length; i++) {
x[i].classList.remove("autocomplete-active");
}
}
function closeAllLists(elmnt) {
var x = document.getElementsByClassName("autocomplete-items");
for (var i = 0; i < x.length; i++) {
if (elmnt != x[i] && elmnt != inp) {
x[i].parentNode.removeChild(x[i]);
}
}
}
document.addEventListener("click", function (e) {
closeAllLists(e.target);
});
}
//This is the list:
var courses = ["Basics Of Automation", "Basics Of ML", "Basics Of AI", "Core Java", "Java Basic", "Artificial Intelligence", "Oracle Database"]
autocomplete(document.getElementById("myInput"), courses);
</script>
Здесь я должен предоставить пользовательский список , который здесь жестко закодирован как курсы .
В представлении часть, использующая этот сценарий:
<form autocomplete="off" asp-action="SaveAddedAccounts">
<div class="row" style="margin-bottom:10px;">
<div class="form-group column">
<label asp-for="CourseName" class="control-label"></label>
<div class="autocomplete" style="width:300px;">
<input id="myInput" type="text" asp-for="CourseName" class="form-control" placeholder="Enter The Course Name" required />
</div>
</div>
</div>
</form>
Это представление находится под AccountController as:
public IActionResult AddAccounts()
{
return View();
}
В AccountController у меня также есть метод JCList , который возвращает список в формате json :
public JsonResult JCList() {
return Json(repObj.CList());
}
Здесь repObj.CList () имеет List<string>
тип возврата.
Так что в основном я хочу использовать список, возвращаемый JCList в сценарии. Для этого я попытался сохранить список в ViewBag как:
public IActionResult AddAccounts()
{
ViewBag.Course = JCList();
return View();
}
и в сценарии:
...
var courses = @ViewBag.Course;
...
но это не работает. Пожалуйста, помогите мне с этим. Может ли этот метод быть вызван Jquery и могут быть использованы возвращенные данные? Если так, возможно как?