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

У меня возникла небольшая проблема с этим фантастическим плагином jqgrid и моей попыткой использовать его со службами данных WCF (не совсем, но очень похожими службами odata4j). Кстати, если кто-то думает об использовании jqgrid со службами odata, пришлите мне строку, я нашел ответы на сложные вопросы, такие как, например, как настроить 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) и не смог получить никаких совпадений с ключевыми словами перед отправкой, там отображаются только данные 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);
    }
});                                                  

person nenea    schedule 23.04.2012    source источник


Ответы (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);
    }
});
person Oleg    schedule 23.04.2012
comment
Олег, ты молодец! Это сработало, и теперь я получил заголовок запроса там, где хотел. Еще раз спасибо. - person nenea; 24.04.2012
comment
@user1352052: Добро пожаловать! Если проблема решена, вы можете принять ответ. С наилучшими пожеланиями! - person Oleg; 24.04.2012