jqgrid редактирование формы editoptions выберите параметр ajax add - PullRequest
2 голосов
/ 11 февраля 2012

Я пытаюсь создать элемент select в форме, редактирующей 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 webmethod?

EDIT : я не подчеркнул, что использую POST для вызова webmethod.Даже если я попробую, как Олег предложил по этой ссылке , это не сработает: (

1 Ответ

2 голосов
/ 11 февраля 2012

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

buildSelect: function (data) {
    var response = data.d;
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...