Я думаю, вам нужен 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;
...