JsonResult не вызывается из представленной функции jQuery - PullRequest
0 голосов
/ 19 декабря 2011

Вот мой JsonResult в моем контроллере:

//
// GET: /Home/GetTags/

public JsonResult GetTags()
{
    List<string> Tags = Db.Tags.Select(t => t.Name).ToList();

    return Json(Tags, JsonRequestBehavior.AllowGet);
}

Вот как будут выглядеть данные, если я зайду в / Home / GetTags:

["Author","Movie","Video Game","Website","Republican","Democrat"]

Вот функция jQuery, на мой взгляд:

<script type="text/javascript">
$(function() {
    function split(val) {
        return val.split(/,\s*/);
    }
    function extractLast(term) {
        return split(term).pop();
    }
    $("#Tags")
        // Don't navigate away from the field on tab when selecting an item
        .bind("keydown", function(event) {
            if (event.keyCode === $.ui.keyCode.TAB && $(this).data("autocomplete").menu.active) {
                event.preventDefault();
            }
        })
        .autocomplete({
            source: function(request, response) {
                $.getJSON("@Url.Action("GetTags")", {
                    term: extractLast(request.term)
                }, response);
            },
            search: function() {
                // Custom minLength
                var term = extractLast(this.value);
                if (term.length < 2) {
                    return false;
                }
            },
            focus: function() {
                // Prevent value inserted on focus
                return false;
            },
            select: function(event, ui) {
                var terms = split(this.value);
                // Remove the current input
                terms.pop();
                // Add the selected item
                terms.push(ui.item.value);
                // Add placeholder to get the comma-and-space at the end
                terms.push("");
                this.value = terms.join(", ");
                return false;
            }
        });
});
</script>

Скопировал jQuery с веб-сайта jQuery UI. Он работал нормально со статическими данными. JsonResult, кажется, не вызывается вообще. Когда я ставлю точку останова и отлаживаю ее, она никогда не достигает точки останова.

Ответы [ 2 ]

0 голосов
/ 21 июня 2012

Видимо, проблема заключалась в «Custom minLength» (т. Е. В свойстве «search» вызова функции «autocomplete ()». Вот пересмотренный jQuery:

<script type="text/javascript">
$(function() {
    function split(val) {
        return val.split(/,\s*/);
    }
    function extractLast(term) {
        return split(term).pop();
    }
    $("#Tags")
        // Don't navigate away from the field on tab when selecting an item
        .bind("keydown", function(event) {
            if (event.keyCode === $.ui.keyCode.TAB && $(this).data("autocomplete").menu.active) {
                event.preventDefault();
            }
        })
        .autocomplete({
            source: function(request, response) {
                $.getJSON("@Url.Action("GetTags")", {
                    term: extractLast(request.term)
                }, response);
            },
            focus: function() {
                // Prevent value inserted on focus
                return false;
            },
            select: function(event, ui) {
                var terms = split(this.value);
                // Remove the current input
                terms.pop();
                // Add the selected item
                terms.push(ui.item.value);
                // Add placeholder to get the comma-and-space at the end
                terms.push("");
                this.value = terms.join(", ");
                return false;
            }
        });
});
</script>

Также я пересмотрел JsonResultв контроллере, например, для предоставления только тех значений, которые соответствуют тому, что пользователь ввел в поле:

//
// GET: /Home/GetTags/

public ActionResult GetTags(string term)
{
    List<string> Tags = Db.Tags.Select(t => t.Name).Where(n => n.Contains(term)).ToList();

    return Json(Tags, JsonRequestBehavior.AllowGet);
}
0 голосов
/ 19 декабря 2011

как насчет добавления [HttpGet] над действием? Итак, это будет:

[HttpGet]
public JsonResult GetTags()
{
    List<string> Tags = Db.Tags.Select(t => t.Name).ToList();

    return Json(Tags, JsonRequestBehavior.AllowGet);
}
...