JQGrid с сервисами данных WCF (OData); loadBeforeSend не вызывается в режиме редактирования; Не могу сделать setRequestHeader

У меня возникла небольшая проблема с этим фантастическим плагином jqgrid и моей попыткой использовать его с WCF Data Services (не совсем, но очень похожими сервисами odata4j). Кстати, если кто-то задумывается об использовании jqgrid со службами odata, пришлите мне строку, я нашел ответы на сложные вопросы, например, например, как настроить grid xmlreader для чтения структуры XML odata, побеждающей проблему поиска в пространстве имен jquery. (подсказки:

включают jquery.xmlns.js

.....
$.xmlns.m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
$.xmlns.d = "http://schemas.microsoft.com/ado/2007/08/dataservices";
.....
var feedXmlReaderOptions = {
    root: "feed",
    row: "entry",
    repeatitems: false,
    id: "feed>entry>id"
};
....
    colModel: [
    {
        name: "clmNumKey", 
        index: "clmNumKey", 
        width: 150, 
        xmlmap: "d|clmNum",
        editable: true
    }
    ....
)

В любом случае, проблема заключается в том, что сервисам odata нужен метод, который обращается к операции редактирования (DELETE, PUT, MERGE), чтобы он отправлялся как пользовательский заголовок запроса на обычном POST, а не как метод http. Причина этого заключается в том, что большинство брандмауэров не разрешают проходить HTTP-методы PUT и DELETE, потому что именно так вы можете, например, размещать новые файлы на сервере, а также удалять файлы, если вы можете угадать действительный путь. Короче говоря... событие loadBeforeSend не вызывается для встроенного редактирования или редактирования формы... Я вижу, что оно вызывается при полном запросе данных таблицы, но я получаю только serializeEditData событие срабатывает, когда я отправляю из формы редактирования. Я волнуюсь, потому что я вошел в исходные файлы jqgrid (grid.formedit.js, grid.inlineedit.js), и я не смог получить какие-либо хиты с ключевыми словами beforesend, там отображается только serializeeditdata. Я что-то пропустил? Есть ли другой способ установить нужные мне заголовки на xhr ajax объект сетка использует? В том, что xhr объект выставлен сеткой?

Ниже у вас есть код, который я должен обрабатывать события редактирования... опять же, loadBeforeSend не срабатывает...

Заранее спасибо, серб

$.extend($.jgrid.edit, {
    closeAfterEdit: true,
    closeAfterAdd: true,
    ajaxEditOptions: {
        contentType: "application/json"
    },
    mtype: 'POST',
    loadBeforeSend: function(xhr)
    {
        xhr.setRequestHeader("X-HTTP-Method", "MERGE");
        return xhr;
    },        
    serializeEditData: function (data) {
        delete data.oper;
        return JSON.stringify(data);
    }
});                                                  

1 ответ

Решение

Нет loadBeforeSend параметр, который вы можете установить с помощью $.jgrid.edit, Значения от $.jgrid.edit определяет параметры по умолчанию для editGridRow.

Чтобы указать loadBeforeSend обратный вызов, который следует использовать во время соответствующего Ajax-запроса, который вы должны использовать ajaxEditOptions вместо этого и укажите beforeSend (см. $.ajax):

$.extend($.jgrid.edit, {
    closeAfterEdit: true,
    closeAfterAdd: true,
    ajaxEditOptions: {
        contentType: "application/json",
        beforeSend: function (jqXHR, settings) {
            jqXHR.setRequestHeader("X-HTTP-Method", "MERGE");
        }
    },
    //mtype: 'POST', - it's already default
    serializeEditData: function (data) {
        delete data.oper;
        return JSON.stringify(data);
    }
});
Другие вопросы по тегам