Редактирование формы 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;
...