ASP MVC vs jQuery UI Автозаполнение - PullRequest
1 голос
/ 10 января 2012

Я знаю, что на этом сайте есть несколько таких же проблем, но я не мог понять это даже с их предложениями решения. Я пытаюсь реализовать функцию автозаполнения пользовательского интерфейса jQuery для получения функции поиска.

Мой контроллер:

    public JsonResult search(int maxRows, string name_startsWith)
    {
        DataContext db = new DataContext();
        var result = (from p in db.Users where p.UserName.Contains(name_startsWith) || p.FirstName.Contains(name_startsWith) || p.LastName.Contains(name_startsWith) orderby p.LastName select p).Distinct().Take(maxRows).ToList();
        return Json(result);
    }

Мой взгляд:

    $("#search").catcomplete({
    source: function (request, response) {
        $.ajax({
            url: "/h/search",
            dataType: "json",
            data: {
                maxRows: 15,
                name_startsWith: request.term
            },
            success: function (data) {
                response($.map(data, function (item) {
                    return {
                        label: item.UserName,
                        value: item.UserId,
                        categoty: "People"
                    }
                }));
            }
        });
    }
});

Итак, как вы понимаете; Я пытаюсь реализовать версию категории. Я беспокоюсь о стоимости товара. Я использую Guid в качестве UserId.

Заранее благодарим за помощь.

EDIT

Я добился определенного прогресса, изменив элемент управления и представление, как показано ниже.

Контроль:

[HttpPost]    
public JsonResult search(int maxRows, string name_startsWith)
    {
        DataContext db = new DataContext();
        var result = new List<User>(); 
        result = (from p in db.Users where p.UserName.Contains(name_startsWith) || p.FirstName.Contains(name_startsWith) || p.LastName.Contains(name_startsWith) orderby p.LastName select p).Take(maxRows).ToList();
        return Json(result, JsonRequestBehavior.AllowGet);
    }

Вид:

    $("#search").catcomplete({
        source: function (request, response) {
            $.ajax({
                type: "POST",
                cache: false,
                dataType: "json",
                url: '@Url.Action("search", "h")',
                data: { maxRows: 15, name_startsWith: request.term },
                complete: function (data) {
                    response($.map(data, function (item) {
                        return {
                            label: item.UserName,
                            category: 'People'
                        }
                    }));
                }
            });
        }
    });

Теперь проблема в следующем: При ожидании поведения «успех»: оно не работает регулярно. Но когда я выбираю «полное» поведение: теперь оно всегда срабатывает, но без значения?

Контроллер, кажется, отправляет значение [count = 1], но json не получает его!?

решаемые

    [HttpPost]
    public JsonResult search(int maxRows, string name_startsWith)
    {
        DataContext db = new DataContext();
        var result = new List<User>(); 
        result = (from p in db.Users where p.UserName.Contains(name_startsWith) || p.FirstName.Contains(name_startsWith) || p.LastName.Contains(name_startsWith) orderby p.LastName select p).Take(maxRows).ToList();
        var viewModel = result.Select(x => new
        {
            value = x.UserName,
            label = x.FirstName + " " + x.LastName,
            category = "People"
        });
        return Json(viewModel, JsonRequestBehavior.AllowGet);
    }

Я решил проблему, упаковав необходимые элементы в ViewModel перед отправкой. Я думаю, что что-то несопоставимое в модели вызывало этот конфликт (500 Internal Server Error) с json. (Решение найдено на этом посте: https://stackoverflow.com/a/8027027/1062284 Спасибо, Дарин!)

1 Ответ

0 голосов
/ 10 января 2012

Попробуйте использовать FireBug в Firefox, чтобы установить точку останова в завершенном событии и проверить, какие данные вы получаете от контроллера.

Успешное поведение работает только тогда, когда вы получаете результат HTTP 200, а не когда сервер возвращает ошибку.

Если вы не можете найти ответ с помощью отладчика Javascript и / или вкладки «Сеть» в Firebug, вы можете добавить ответ на запрос http на ваш вопрос, и, возможно, я увижу проблему.

...