Редактирование формы jqg. Опции выбора. Выберите параметр добавления ajax.

Я пытаюсь построить элемент выбора в форме редактирования jqgrid, вызвав ajax webmethod (asp.net).

Все прекрасно работает, если я вызываю метод без параметра. Это не работает, если я пытаюсь вызвать веб-метод, ожидающий строковый параметр:

это фрагмент кода:

ajaxSelectOptions: { type: "POST", contentType: 'application/json; charset=utf-8', },
colNames: ['City', 'State'],
colModel: [
{ 
    name: 'City', 
    index: 'City', 
    align: "center", 
    width: 80, 
    searchoptions: { sopt: ['eq', 'ne', 'cn']} ,
    edittype: 'select',
    editable: true, 
    editrules: { required: true },
    editoptions: { 
        dataUrl: '<%# ResolveUrl("~/Service/Domain/ServiceGeographic.asmx/GetCityByState") %>',
        buildSelect: function (data) {
        var retValue = $.parseJSON(data);
        var response = $.parseJSON(retValue.d);

        var s = '<select id="customer_City" name="customer_City">';

        if (response && response.length) {
            for (var i = 0, l = response.length; i < l; i++) {
            s += '<option value="' + response[i]["Id"] + '">' + response[i]["Descrizione"] + '</option>';
            }
        }

        return s + "</select>";
        }                        
    }
},
...

Где я могу установить параметр для отправки в веб-метод GetCityByState?

РЕДАКТИРОВАТЬ: я не подчеркнул, что я использую POST для вызова веб-метода. Даже если я попробую, как предложил Олег по этой ссылке, это не сработает:(

1 ответ

Решение

Я думаю, что вам нужен параметр ajaxSelectOptions jqGrid. Например, если вам нужно иметь идентификатор выбранной строки в качестве дополнительного id параметр отправляется на веб-метод, идентифицируемый dataUrl ты можешь использовать data параметр ajaxSelectOptions в форме функции:

ajaxSelectOptions: {
    type: "GET", // one need allows GET in the webmethod (UseHttpGet = true)
    contentType: 'application/json; charset=utf-8',
    dataType: "json",
    cache: false,
    data: {
        id: function () {
            return JSON.stringify($("#list").jqGrid('getGridParam', 'selrow'));
        }
    }
}

потому что в коде над параметром dataType: "json" используются, вы должны изменить первую строку buildSelect от

buildSelect: function (data) {
    var retValue = $.parseJSON(data);
    var response = $.parseJSON(retValue.d);
    ...

в

buildSelect: function (data) {
    var response = $.parseJSON(data.d);
    ...

Более того, потому что вы используете линию $.parseJSON(data.d) Я могу предположить, что вы возвращаете данные с веб-метода неправильно. Обычно тип возвращаемого значения из веб-метода должен быть классом. Вы не должны включать никаких вызовов ручной сериализации возвращаемого объекта. Вместо этого некоторые люди неправильно понимают это и заявляют string в качестве типа возврата веб-метода. Они делают серию JSON вручную с вызовом DataContractJsonSerializer или же JavaScriptSerializer, В результате сериализованные вручную данные, возвращаемые в виде строки, будут еще раз сериализированы. Это причина, почему вы можете сделать два звонка $.parseJSON: var retValue = $.parseJSON(data); var response = $.parseJSON(retValue.d);, Если вы будете использовать dataType: "json" Внутри ajaxSelectOptions и если вы не будете выполнять ручную сериализацию в JSON в веб-методе и просто заново создаете объект, как это было бы, вам не нужно вызывать $.parseJSON совсем. Вы можете просто использовать напрямую data.d:

buildSelect: function (data) {
    var response = data.d;
    ...
Другие вопросы по тегам