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);
}
});