Select2 с методом ajax post

Я пытаюсь использовать select2 с загрузкой ajax.

Вот мой код:

clonedTemplate.find('[id^=detailsPhaseFinanceMinor_]').select2({
    placeholder: "Select",
    minimumInputLength: 1,
    ajax: { // instead of writing the function to execute the request we use Select2 convenient helper
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        url: "mapBasic.aspx/GetFinSys",
        dataType: 'json',
        data: function (term, page) {
            return "{'term':\"" + term + "\"}";
        },
        results: function (data, page) { // parse the results into the format expected by Select2.
            // since we are using custom formatting functions we do not need to alter remote JSON data
            return { results: data.Value };
        }
    }
});

Вызов ajax - это webmethod/pagemethod в коде для одной и той же страницы:

[WebMethod]
    public static List<LookupCodeItem> GetFinSys(string term)
    {
        string stringToCompareTo = term.ToLower();

        List<LookupCodeItem> result = new List<LookupCodeItem>();


        // FIN SYS
        using (mapEntities db = new mapEntities())
        {
            List<MPO_FINSYS_AMT> finSysCodes = (from x in db.MPO_FINSYS_AMT
                                                select x).ToList();

            foreach (MPO_FINSYS_AMT item in finSysCodes)
            {
                string valKey = string.Format("{0}.{1}.{2}", item.FY, item.MDOT_MPO_CD, item.FIN_SYS);
                LookupCodeItem x = new LookupCodeItem();
                x.Value = valKey;
                x.ShortDescription = string.Format("{0}.{1}.{2}", item.FY, item.MDOT_MPO_CD, item.FIN_SYS); ;
                x.LongDescription = string.Empty;
                result.Add(x);

            }
        }

        return result;
    }

При вводе данных в текстовое поле выполняется запрос POST, и отправление json выглядит правильно отформатированным.

Однако ответ из pagemethod - это вся html-страница. Насколько я понимаю, это может произойти с методами post, если у вас нет надлежащего набора "contentType" в вызове ajax. Я установил его так же, как и все мои другие вызовы ajax, которые работают на странице (они не используют select2).

Ли select2 игнорирует атрибут contentType? Или есть что-то еще, что я сделал неправильно?

** РЕДАКТИРОВАТЬ ** После публикации этого вопроса я нашел эту проблему на сайте select2 github: Проблема 492 - Добавить поддержку contentType для Ajax

Похоже, что он не пропускает contentType. Могу ли я обойти selet2, встроенный в помощник ajax, и использовать свой собственный вручную определенный?

Ответ 1

У меня была такая же проблема, и ниже решение работает для меня:

ajax: {
   ...
   params: { // extra parameters that will be passed to ajax
        contentType: "application/json; charset=utf-8",
   }
   ...
}

Ответ 2

Не забудьте добавить маркер CSRF в свой почтовый запрос. Возможно, вы делаете все правильно на стороне клиента, но сервер отказывается от запроса, потому что ему не хватает токена. См. Например, для PHP Laravel Framework: https://laravel.com/docs/5.4/csrf#csrf-x-csrf-token для получения дополнительной информации.

Ответ 3

Я бы предложил использовать WebApi или ServiceStack для ваших вызовов данных вместо [webmethod].