2012-04-23 2 views
4

У меня возникла проблема с этим фантастическим плагином jqgrid и моей попыткой использовать его с службами данных WCF (не очень, но очень похожими службами odata4j). Кстати, если кто-то думает об использовании jqgrid с услугами odata, пожалуйста, пришлите мне строку, я нашел ответы на сложные вопросы, например, как настроить grid xmlreader для чтения структуры xata odata, которая побеждает в поиске пространства имен jquery вопрос ( намеков:JQGrid с службами данных WCF (OData); loadBeforeSend не вызывается в режиме редактирования; Не могу сделать setRequestHeader

включает 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-метод. Причина в том, что большинство брандмауэров не разрешают PUT и DELETE http me потому что вы можете, например, размещать на сервере новые файлы, а также удалять файлы, если вы можете угадать допустимый путь. Длинная история короткая ... событие loadBeforeSend не запускается для встроенного редактирования формы или формы ... Я вижу, что он запускается при полном запросе данных в сетке, но я получаю только событие , вызванное, когда я отправляю из редактирования форма. Я волнуюсь, потому что я вошел в исходные файлы jqgrid (grid.formedit.js, grid.inlineedit.js), и я не смог получить никаких хитов с ключевыми словами beforesend, там отображается только serializeeditdata. Я что-то упустил? Есть ли другой способ установить нужные заголовки на объекте ajax xhr, который использует сетка? Это объект xhr, выставленный сеткой? не

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

Спасибо заранее, Serban

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

ответ

3

Есть нет loadBeforeSend параметр, который вы можете установить $.jgrid.edit. Значения от $.jgrid.edit определяют значение по умолчанию options из 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); 
    } 
}); 
+0

Олег, ты рок дружище! Это сработало, и теперь я получил свой заголовок запроса, где хотел. Еще раз спасибо. – nenea

+0

@ user1352052: Добро пожаловать! Если проблема решена, вы можете ["принять"] (http://meta.stackexchange.com/a/5235/147495) ответ. С наилучшими пожеланиями! – Oleg