JQuery UI Autocomplete не достигает ActionResult С# MVC

Я прочитал много сообщений с одной и той же проблемой, но ни одна из них не помогла, поэтому извиняюсь за дублированный вопрос:( Ive следил за простым образцом на сайте JQueryUI по жестким значениям кодирования, а автозаполнение работает, но мне нужно, чтобы он появился моя база данных.

Вид:

@Html.TextBoxFor(model => model.Position, new { @type = "text", @id = "jobtitle", @name = "jobtitle", @placeholder = "Job Title" })

JS:

EDIT: я добавил предупреждение об успешности и вызывается предупреждение, но нет данных (т.е. данные не извлекаются из БД)

<script>
$(function () {
            $("#jobtitle").autocomplete({
                source: function (request, response) {
                    $.ajax({
                        url: '@Url.Action("JobsAutoFill", "Account")',
                        data: {
                            Prefix: request.term
                        },
                        success: function (data) {
                            alert(data);
                            response(data);
                        }
                    });
                },
                minLength: 1
            });

            //$("#jobtitle").autocomplete({
            //    source: "/Account/JobsAutoFill/"
            //});
        });
</script>

И я добавил необходимые ссылки:

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

Ниже мой ActionResult (на самом деле JsonResult) и функция, чтобы вывести список заданий:

    public List<Jobs> GetAllJobs()
    {
        List<Jobs> JobsList = new List<Jobs>();

        using (RBotEntities EF = new RBotEntities())
        {
            var JobsListQuery = (from ED in EF.EmploymentDetails
                                   select new
                                   {
                                       ED.pkiEmploymentDetailID,
                                       ED.Position
                                   });

            foreach (var item in JobsListQuery)
            {
                JobsList.Add(new Jobs
                {
                    Id = item.pkiEmploymentDetailID,
                    Name = item.Position
                });
            }
        }

        return JobsList;
    }

public JsonResult JobsAutoFill(string Prefix)
        {
            //Note : you can bind same list from database  


            List<Jobs> ObjList = new List<Jobs>();

            ObjList = GetAllJobs();

            //Searching records from list using LINQ query  


            var JobNames = (from N in ObjList
                            where N.Name.StartsWith(Prefix)
                            select new { N.Name });
            return Json(JobNames, JsonRequestBehavior.AllowGet);
        }

Я что-то упустил или что-то сделал не так?

Я ценю любую помощь, спасибо!

Ответ 1

Я заработает!

Первое, что вызывало проблему, было то, что мне нужно добавить [AllowAnonymous] над моим ActionResult.

Во-вторых, я изменил свой вызов Ajax на это:

$(function () {
    $("#jobtitle").autocomplete({
        source: function (request, response) {
            $.ajax({
                url: '@Url.Action("JobsAutoFill", "Account")',
                data: {
                    Prefix: request.term
                },
                success: function (data) {
                    response($.map(data, function (obj) {
                        return {
                            label: obj.Name,
                            value: obj.Name
                        };
                    }));
                }
            });
        },
        minLength: 1
    });
});

Ниже мой ActionResult. Я добавил изменение, которое позволит разобраться в чувствительности к регистру:

[AllowAnonymous]
public JsonResult JobsAutoFill(string Prefix)
{
    //Note : you can bind same list from database  


    List<Jobs> ObjList = new List<Jobs>();

    ObjList = GetAllJobs();

    //Searching records from list using LINQ query  


    var JobNames = (from N in ObjList
                    where N.Name.ToLower().StartsWith(Prefix.ToLower())
                    select new { N.Name });
    return Json(JobNames, JsonRequestBehavior.AllowGet);
}

Ответ 2

Вы не должны использовать AllowAnonymous, если у него нет открытого доступа. И, во-вторых, измените свой запрос на лучшую производительность:

var JobNames = (from N in ObjList
                where N.Name.ToLower().StartsWith(Prefix.ToLower())
                select N.Name);

Очевидно, вам нужно вернуть массив строк. Но ваш код возвращает массив объектов, который имеет одно свойство строки.

И измените свой script код в соответствии с обновлениями:

success: function (data) {
                    response($.map(data, function (obj) {
                        return {
                            label: obj,
                            value: obj
                        };
                    }));
                }

Ответ 3

Dont Change разрешить анонимному изменению вашего вызова ajax, например, передать ваш параметр в строке запроса, это приведет к вашей задней функции. надеюсь, это поможет вам

$(function () {
$("#jobtitle").autocomplete({
    source: function (request, response) {
        $.ajax({
            url: '@Url.Action("JobsAutoFill", "Account")?Prefix='+$("#jobtitle").val(),
            data: {
                Prefix: request.term
            },
            success: function (data) {
                response($.map(data, function (obj) {
                    return {
                        label: obj.Name,
                        value: obj.Name
                    };
                }));
            }
        });
    },
    minLength: 1
});

});