Настройка типа содержимого запросов, выполняемых jQuery jqGrid

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

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

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

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

и я бы хотел:

application/json; charset=utf-8

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

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

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

Update: Реакция Олега решила его решить.

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

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

Ответ 1

Как вы можете найти в коде 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.

С уважением.