Как предоставить пользовательский список строк для автозаполнения, вызвав метод, который возвращает список в виде JSON? - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над проектом 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 и могут быть использованы возвращенные данные? Если так, возможно как?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...