Установка типа содержимого запросов, выполняемых jQuery jqGrid - PullRequest
22 голосов
/ 20 апреля 2010

Я использую последнюю версию jqGrid : 3.6.4

Это похоже на простую проблему (или, по крайней мере, до того, как я потратил на это несколько часов):

Когда сетка отправляет запрос на сервер (к действию контроллера), ее тип контента всегда:

application/x-www-form-urlencoded; charset=UTF-8

и мне бы хотелось, чтобы это было:

application/json; charset=utf-8

но я не могу найти способ установить тип контента (нет опции contentType, как вы могли бы найти, например, при вызове $ .ajax).

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

Спасибо, Найджел.

Обновление: Исправленный ответ Олега решил.

Вот настройки параметров для сетки:

jQuery("#ContactGridList").jqGrid({
        url: '/ContactSelect/GridData/',
        datatype: 'json',
        ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
        mtype: 'POST',
        ...

1 Ответ

26 голосов
/ 21 апреля 2010

Как вы можете найти в коде grid.base.js вызов $.ajax, заполняющий сетку, выглядит следующим образом:

$.ajax($.extend({
    url: ts.p.url,
    type: ts.p.mtype,
    dataType: dt,
    data: $.isFunction(ts.p.serializeGridData) ?
             ts.p.serializeGridData.call(ts, ts.p.postData) : ts.p.postData,
    complete: function (req, st) {
       ...
    }
    ...
}, $.jgrid.ajaxOptions, ts.p.ajaxGridOptions));

Таким образом, вы можете использовать опцию ajaxGridOptions jqGrid для установки или переопределения любого параметра запроса $.ajax. Поскольку я использую только запросы JSON к своему серверу, я установил общую настройку contentType, например

$.extend($.jgrid.defaults, {
    datatype: 'json',
    {ajaxGridOptions: { contentType: "application/json" },
    {ajaxRowOptions: { contentType: "application/json", type: "PUT" },
    ...
});

ajaxRowOptions используются в grid.inlinedit.js для редактирования строк. Для редактирования формы есть другие параметры, которые я также установил как глобальные настройки:

$.extend($.jgrid.edit, {
    ajaxEditOptions: { contentType: "application/json" },
    ...
});

$.extend($.jgrid.del, {
    ajaxDelOptions: { contentType: "application/json" },
    mtype: "DELETE",
    ...
});

Как вы можете видеть, мой сервер - это служба RESTfull (разработанная главным образом в WFC, а остальные в ASP.NET MVC). Поскольку $.jgrid.edit является настройкой для элементов «добавить» и «изменить», я не могу изменить mtype: "PUT" только для «редактирования», поэтому я делаю это в параметрах navGrid().

Последний параметр ajax, который вы также можете найти интересным для установки, это ajaxSelectOptions. Вы можете установить его так же, как ajaxGridOptions. Параметры ajaxSelectOptions полезны, если вы используете параметр dataUrl внутри editoptions или searchoptions. Я использую, например, dataUrl внутри colModel для определения столбцов типа edittype: 'select'. Возможные значения опции выбора будут загружены с сервера для встроенного редактирования или редактирования формы или внутри диалогового окна поиска. Поскольку для такой загрузки данных используются ajax, существует соответствующая опция ajaxSelectOptions.

С уважением.

...